aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick
Commit message (Collapse)AuthorAgeFilesLines
* Remove remnants of blackberry platform supportRobin Burchell2017-01-164-111/+0
| | | | | | | | The last remnants were removed from qtbase in 5.7 making this all dead code, so match here too. Change-Id: I10f3f1c614562f2a97ade7cdf5002065d6f79e07 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.8' into devLiang Qi2017-01-141-1/+1
|\ | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I9d87ed86e95b5901a86cc3aa65d7ac39b0b708c2
| * graph example: Fix MSVC warning about truncation of 'double'Friedemann Kleint2017-01-101-1/+1
| | | | | | | | | | | | | | | | graph.cpp(105): warning C4305: 'argument': truncation from 'double' to 'float' Change-Id: I644dec9be8aeb1837a2b7402f7ab7c3b3beb7e1b Reviewed-by: Jesus Fernandez <jesus.fernandez@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-12-253-3/+4
|\| | | | | | | | | | | | | Conflicts: tools/qmlimportscanner/main.cpp Change-Id: I01e17581f6691a03f83788773364d0cf96319514
| * Merge remote-tracking branch 'origin/5.8.0' into 5.8Liang Qi2016-12-251-2/+3
| |\ | | | | | | | | | Change-Id: I72ed8656ef03d1bc28225e2186f03620b9e119e9
| | * Calqlatr Example: Pass the third arg to the mapToItem() callsVenugopal Shivashankar2016-12-091-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apparently the mapToItem version used in the example requires at least three arguments, for some reason only two were provided, the item and the mouseX coordinate. Without the third argument, mouseY coordinate, the drag operation to move the display fails with warnings on the console. Task-number: QTBUG-57514 Change-Id: If1b16c27539bd90a2d20203dedc26f11ac2a0942 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Topi Reiniö <topi.reinio@qt.io> Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * | Example: corrected screenshot of the localstorage appNico Vertriest2016-12-212-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Was still displaying a screenshot of the previous example \image --> \borderedimage Change-Id: Ifb23d0ffe1216c7d79170b6bbbd7da1511afe79c Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
* | | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-12-1427-788/+1363
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp src/qml/qml/qqmlimport.cpp src/quick/items/context2d/qquickcontext2dtexture_p.h tools/qmleasing/splineeditor.h Change-Id: I8f6630fcac243824350986c8e9f4bd6483bf20b5
| * | Example: correction initialization fields Header.qmlNico Vertriest2016-12-131-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | Error msg: Can't assign to existing role 'distance' of different type [String -> Number] Change-Id: I28842ed25a56077e52496a229294ef992406ca1d Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * | Example: Improve the localstorage exampleNico Vertriest2016-12-1212-173/+669
| | | | | | | | | | | | | | | | | | | | | | | | - insert/update/delete instead of only insert - database connection and sql handled in Database.js Change-Id: I513b23061e569f4511dd166ed79898db7f628139 Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
| * | examples\..\scenegraph.pro: Remove duplicate entry textureinsgnodeFriedemann Kleint2016-12-011-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes build warnings: Cannot add commands to previously defined target sub-textureinsgnode-qmake_all. Cannot add commands to previously defined target sub-textureinsgnode. Cannot add commands to previously defined target sub-textureinsgnode-make_first. Change-Id: Ieaa8b688fa112d42efa05721ff3bfe251036a69b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * | StocQt example: Use QtQuick.Layouts instead of anchorsVenugopal Shivashankar2016-11-3011-654/+734
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Move the StockListView delegate and the top banner to separate files. - Use QtQuick.Layouts in place of anchors for most parts, improving code readability and app scalability. Change-Id: Ie8f13ef261bb343f15e9484bd15f8b94101daeb5 Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
| * | Get rid of most QT_NO_FOO usagesLars Knoll2016-11-294-7/+7
| |/ | | | | | | | | | | | | | | Instead use QT_CONFIG(foo). This change actually detected a few mis-spelled macros and invalid usages. Change-Id: I06ac327098dd1a458e6bc379d637b8e2dac52f85 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Enable shader disk cache in Qt QuickLaszlo Agocs2016-11-275-28/+24
| | | | | | | | | | | | Change-Id: I14ee97ee75664c5dfcd229a5be2be6294c936b2c Task-number: QTBUG-55496 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
* | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-11-2311-141/+148
|\| | | | | | | | | | | | | Conflicts: src/qml/jsruntime/qv4object_p.h Change-Id: Iff4d3aba7710a999b8befdc493cbe959e1ce02f9
| * rendernode example: do not rely on build-time shader compilationLaszlo Agocs2016-11-225-22/+21
| | | | | | | | | | | | | | | | | | | | | | | | There is no public intrastructure for this. Relying on the internal qmake rule in qtdeclarative is wrong as it is not meant for public consumption and is not available in out of tree examples in the installed Qt anyway. Instead, ship the bytecode for now. Task-number: QTBUG-56327 Change-Id: I19327aa880ad573560d1e9376f36c67aa509b51a Reviewed-by: Andy Nichols <andy.nichols@qt.io>
| * QSGRendererInterface: Add Resource suffix for consistencyLaszlo Agocs2016-11-182-3/+4
| | | | | | | | | | Change-Id: I60e674760725d4c4dd13f53b31c3abb6b09c1790 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Merge remote-tracking branch 'origin/5.7' into 5.8Simon Hausmann2016-11-153-60/+67
| |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/jsruntime/qv4string.cpp The conflict resolution for qv4tsring.cpp is to essentially omit the change of commit 64714ea431f2fd355ed27edc69dba4e992511e75 as the code in 5.8 already uses the add/mul_overflow functions. This merge also reverts commit f4ac007f4a19bc095ff15d415a6629986de78e49 as we can deal with dead store elimination now. Change-Id: Iee08c87cbe1a2ff23a73ce621d56262b4e007c56
| | * Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-11-151-0/+1
| | |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qmldevtools/qmldevtools.pro tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp Change-Id: I12255c16716bd8a74e7047cdb1f9302a4d1ea827
| | | * Example: Enable auto scaling on HighDPI screensVenugopal Shivashankar2016-10-281-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | Task-number: QTBUG-56425 Change-Id: I2246245216fb8cd0d4dc4b15a0687edfc64ccad1 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
| | * | StocQt example: Prefetch values for stock list modelTopi Reinio2016-11-142-60/+66
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of doing a network request for each item in the stock list, prefetch values for all entries when creating the model. This improves performance when scrolling the list. Task-number: QTBUG-56114 Change-Id: I12f0012ec0a97f2bf03b53a5b51076171cd7fc7a Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
| | * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-10-271-1/+1
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/quick/items/qquickwindow.cpp tests/auto/quick/qquicktext/BLACKLIST tests/auto/quick/qquicktextedit/BLACKLIST Change-Id: I8bd68b0b5e853b7908791d2cbddd18dd527c76ae
| * | | Adjust positioners example for toolingThomas Hartmann2016-11-152-56/+56
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Fully qualify all property bindings * Not using flow as id, because it collides with the property flow These changes are required so the example works nicely in the designer. Change-Id: I05972a5a7ebe7277ae7f4230bb68a8b8b011b2f3 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
* | | | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-10-187-16/+35
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/jsruntime/qv4variantobject.cpp src/qml/types/qquickworkerscript.cpp src/quick/scenegraph/util/qsgdefaultpainternode_p.h tools/qmljs/qmljs.cpp Change-Id: I876242714ec8c046238d8fd673a5ace2455b2b59
| * | | Merge remote-tracking branch 'origin/5.6' into 5.8Simon Hausmann2016-10-131-1/+1
| |\ \ \ | | | |/ | | |/| | | | | Change-Id: I175b27337b534c0b8f46a4a792d2c43cde73ffc4
| | * | Example: Use TextInput's displayText property instead of lengthVenugopal Shivashankar2016-10-131-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The replace Text item that is overlayed on the TextInput, behaves like the TextField.placeholderText property. The opacity of the item varies based on whether the TextInput has any text or not. Using the length property to adjust the opacity fails on platforms such as Android where the length is not updated until the text is committed (i.e. until you hit the [ENTER] key). Whereas the displayText property is updated when you key in text, so it is ideal to use the length of the displayText than the length property itself. Change-Id: I678e5db5e5d5027e4aae816b6620095c68138eb7 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
| * | | Use d3d12 feature in rendernode exampleLaszlo Agocs2016-10-114-7/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Migrate the example away from config_d3d12 and make the feature public. Task-number: QTBUG-56327 Change-Id: I88809b8c41282cd75952d085cfd539a5d80f3f38 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | | Merge remote-tracking branch 'origin/5.7' into 5.8Liang Qi2016-10-102-8/+28
| |\ \ \ | | | |/ | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/quick/quickwidgets/quickwidget/main.cpp src/qml/jsruntime/qv4jsonobject.cpp src/qml/jsruntime/qv4qobjectwrapper.cpp src/qml/jsruntime/qv4qobjectwrapper_p.h src/qml/qml/qqmlengine.cpp src/qml/qml/qqmlpropertycache.cpp src/qml/qml/qqmlpropertycache_p.h src/quick/items/qquickanimatedsprite.cpp src/quick/items/qquickitem.cpp src/quick/items/qquickitem.h src/quick/items/qquickitem_p.h src/quick/items/qquickview_p.h src/quick/scenegraph/qsgcontext.cpp src/quick/scenegraph/qsgdefaultrendercontext.cpp Change-Id: I172c6fbff97208f21ed4c8b6db3d1747a889f22b
| | * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-09-302-8/+28
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: tests/auto/quick/qquicktext/tst_qquicktext.cpp Change-Id: I241cd418bb7e7b95e0a0a2ee4c465d48be2a5582
| | | * Enhance quickwidget example with all grabbing casesLaszlo Agocs2016-09-222-8/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a demo of QQuickItem::grabToImage(), in addition to grabFramebuffer() and render(). This way all possible approaches are demonstrated and tested. Task-number: QTBUG-55879 Change-Id: I13c427730c416f0d87f83092627e2cb46aba2cc4 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Andy Nichols <andy.nichols@qt.io>
* | | | Enable making window-screen associations from QMLLaszlo Agocs2016-10-105-7/+91
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Qt Quick provides a Screen attached property to query information about the screen an item's window belongs to. This is a good start, but has two problems: it lacks some virtual desktop related info (e.g. the position in the virtual desktop) and it cannot be used in combination with the Window element in order to achieve a QML equivalent of QWindow::setScreen(). Therefore add the missing virtualX and virtualY properties and introduce Qt.application.screens. The latter is an equivalent to QGuiApplication::screens() and is a JS array the elements of which can be set as the value of the new Window.targetScreen property. This means that a call like window->setScreen(QGuiApplication::screens()[0]) translates to Window { targetScreen: Qt.application.screens[0]; ... } when using the Window type from QML. Screen addition or removal can be acted upon via onScreensChanged. QQuickScreenAttached has been split into two in order to allow reusing the QScreen wrapping queries for other purposes as well. Task-number: QTBUG-56115 Change-Id: I4b2fbd873315b40d0afe878da2fc50966c00e2e0 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | | | add shared Label for examples, and use in the Window exampleShawn Rutledge2016-10-106-21/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It just saves the trouble of setting the Text color to the correct palette text color repeatedly, and avoids having black text on a dark background in case a dark theme is in use. Change-Id: If5c38fabe7f047fa5f6956a9d8b235886ab7ab5c Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | | | Merge remote-tracking branch 'origin/5.8' into devLiang Qi2016-09-211-1/+1
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4isel_moth_p.h Change-Id: I8e86a649d1ef8ad27dc66cc8c290093b2faabc69
| * | | Fix sqlite detectionLars Knoll2016-09-121-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | There is now a sql-sqlite feature in qtbase that should get used. Change-Id: I99609a140b3a3c0acf749ff14df21fba89a978fb Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | | examples: replace 'foreach' with 'range for'Anton Kudryavtsev2016-09-038-16/+21
|/ / / | | | | | | | | | | | | | | | | | | | | | While touching the code, replace QStringLiteral with QL1S in QStringBuilder expression. Change-Id: I2519b254d82453e1c9bd5b834c0bd78e5c026f83 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | | Adjust decarative after qtConfig changes in qtbaseLars Knoll2016-08-192-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | Most of the changes are optional, but cleanup our QT_CONFIG usage. Change-Id: I5253d53f72f6fb03c2cfedae1e17d94f424a6bbb Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | softwarerenderer example: fix ambiguous reference to QQuickItemShawn Rutledge2016-08-171-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | GCC 6 says (with paths trimmed) In file included from customrenderitem.cpp:47:0: softwarerenderer.h:51:35: error: expected ')' before '*' token softwarerenderer.h:61:5: error: reference to 'QQuickItem' is ambiguous Change-Id: I70b328426ac48f5f6140d1ad4f015858979b99a5 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | | Merge remote-tracking branch 'origin/5.7' into devLiang Qi2016-08-172-2/+2
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qqmltypecompiler.cpp src/qml/compiler/qv4isel_moth.cpp src/qml/compiler/qv4ssa_p.h src/qml/qml/qqmlobjectcreator.cpp Change-Id: I8bb7fe773d657f908f20ee5e72c2b9bd643f6260
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-08-132-2/+2
| |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4isel_moth.cpp src/qml/compiler/qv4ssa_p.h tests/benchmarks/qml/qqmlimage/qqmlimage.pro tests/benchmarks/qml/qqmlimage/tst_qqmlimage.cpp Change-Id: Iad11ce7fdf0c6d200fdebc16a94081bd8069a87a
| | * Shader examples: initialize all membersEdward Welbourne2016-08-112-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Coverity (CIDs 161677, 161674) caught us setting a bad example in our example code. Change-Id: I395f689586f9a6ad783328b9258096cbc9ccd692 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
* | | Merge remote-tracking branch 'origin/5.7' into devLiang Qi2016-08-091-2/+1
|\| | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/qml/qqmlcomponent.cpp tests/auto/quick/scenegraph/tst_scenegraph.cpp Change-Id: Ibc811b95a57f175ca53337db7bbd1f575a745937
| * | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-08-051-2/+1
| |\| | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h Change-Id: I1e6a9424e7f87d9e4ac1ea387ec70e151106f1c7
| | * photoviewer depends on xmlpatternsLaszlo Agocs2016-08-041-2/+1
| | | | | | | | | | | | | | | Change-Id: Ifc047a7492d0452c86777f1e6a5671421b7065d3 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | QSG: Make example namespace-awareErik Verbruggen2016-08-031-0/+4
| | | | | | | | | | | | | | | Change-Id: Ic2c101d49f4140a85f2e9f79c8df78e38a4404f5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Merge "Merge remote-tracking branch 'origin/5.7' into dev" into refs/staging/devLiang Qi2016-08-034-28/+5
|\ \ \
| * | | Merge remote-tracking branch 'origin/5.7' into devEdward Welbourne2016-08-024-28/+5
| |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/quick/items/qquickshadereffect.cpp 5.7 had a bug-fix in code dev has replaced wholesale. src/quick/items/qquickwindow.cpp src/quick/items/qquickwindow_p.h One side changed a method's signature; the other side renamed a method declared adjacent to it and changed some code using it, moving some from the public class to its private partner. tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp One side added a blank line before a comment the other re-wrote. Kept the re-write, killed the stray blank. .qmake.conf Ignore 5.7's change to MODULE_VERSION. src/qml/compiler/qqmltypecompiler.cpp src/qml/compiler/qqmlpropertyvalidator.cpp 5.7 changed code in the former that dev moved to the latter. Reflect 5.7's changes there, adapted to dev's form. src/qml/qml/qqmlobjectcreator.cpp One side added new QVariant types; the other changed how it handled each type of QVariant (without git seeing any conflict); adapted the new stanzas to work the same as the transformed ones. tests/manual/v4/test262 dev had a broken sha1 for it; so used 5.7's 9741ac4655808ac46c127e3d1d8ba3d27ada618e Change-Id: I1fbe2255b97d6ef405cdd1d0cea7fab8dc351d6f
| | * | Doc: minor spelling issueNico Vertriest2016-07-191-2/+2
| | | | | | | | | | | | | | | | | | | | Change-Id: I18316de7c0eaee98a7eb0aa274c06864af471116 Reviewed-by: Martin Smith <martin.smith@theqtcompany.com>
| | * | Merge remote-tracking branch 'origin/5.6' into 5.7Edward Welbourne2016-07-153-26/+3
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/quick/demos/photoviewer/deployment.pri One side made it redundant; the other removed part of it; remove it all ! src/quick/scenegraph/util/qsgatlastexture.cpp One side changed a preprocessor condition, the other a code condition, on adjacent lines; keep both changes. tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp One side changed a condition, the other the content of its block; keep both. Change-Id: Idb8937f92a7edb28212449dfe0c5cfdb8e6de986
| | | * demos: Fix installation of photoviewer example and add to buildRobin Burchell2016-07-053-30/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | deployment.pri seems suspicious (and qmake errors about it actually), so just use the example install path and trust that it will be okay. Change-Id: Id3b6abd80f84485e006473130873ab89ee11c0d4 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
* | | | Add optional flags and rect to QSGRenderNodeLaszlo Agocs2016-08-026-1/+37
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Having rendernodes triggering fullscreen updates with the software backend is not ideal. Therefore, introduce the option of reporting that the rendernode is well-behaving, meaning it only writes inside the reported bounding rectangle. Similarly, the OpenGL batch renderer can keep using the depth buffer when the rendernode is known to behave like the renderer expects. Change-Id: I6acc434432c2504776f26e8917b5434b44be293d Reviewed-by: Gunnar Sletta <gunnar@sletta.org>