Commit Graph

19464 Commits

Author SHA1 Message Date
Shawn Rutledge
6ad66140b1 add buttons to QTabletEvent
Until now, it has been necessary for tablet-oriented applications which
care about multi-button styli to reject each tablet event and wait for
the mouse event in order to know which buttons are pressed.  This patch
adds the new API and also the X11/xcb implementation.

[ChangeLog][QtCore][Tablet support] Added buttons to QTabletEvent

Task-number: QTBUG-39458
Change-Id: If2c9ec1ceacc1700a82686c5fc6f568f9111055a
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
2014-07-28 16:37:44 +02:00
Shawn Rutledge
67410cd644 Windows: correct tablet stylus rotation to range -180..180 degrees
When the user holds the Wacom Art Pen straight, rotation is zero;
when turning it counter-clockwise, it should have a negative angle,
whereas the driver sends a positive angle multiplied by 10;
when turning it clockwise it should have a positive angle up to 180,
whereas the driver sends 360 * 10 going downwards towards 180 * 10.
These corrections make the angle reading the same between Linux and
Windows.

Task-number: QTBUG-39570
Change-Id: I9f18ef6629bffa849c8d65cba02d42b21469cebc
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
2014-07-28 16:37:31 +02:00
Marc Mutz
a5578d216a tst_QFont: remove unused static function
This function has been inlined in commit 4f50be8d,
but wasn't removed.

Change-Id: I1a4eb7399ab2dd87a9fb15c4c886004d777487a8
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
2014-07-28 10:58:06 +02:00
Olivier Goffart
9f598d5ee9 Logging: support %{backtrace} in QT_MESSAGE_PATTERN
On supported platform, allow to show a backtrace by using
%{backtrace} or %{backtrace depth=N separator="|"}

[ChangeLog][QtCore][Logging] QT_MESSAGE_PATTERN can include a
backtrace using %{backtrace}

Change-Id: Ib00418c070d3bd6fe846dc04bf69fa91ba64f9cd
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
2014-07-28 09:03:47 +02:00
João Abecasis
04b92bfa1a Don't track the sharable bit upon detach
"Unsharables", given they can't be shared, don't need to detach, so skip the
check altogether and don't try to propagate the flag. It shouldn't be.

Change-Id: Icc483401d5a57708b43d64bd3cebc66c6b934815
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-28 08:40:34 +02:00
Jędrzej Nowacki
959808cc4d Refactor QString::split functions.
Implementation of the functions were moved to templatized helper
functions that will be shared with QString::splitRef in future.

Change-Id: Ie25fab57f77f5ceb11ced26ab7e7f86739f4c78b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-28 08:40:09 +02:00
João Abecasis
116d711cb1 Ensure mutating operations are NOT performed on immutable data
"Static" and "raw" data are immutable and shouldn't be modified from
within the QArrayData API. Adding the asserts here gives us a basic
safety net.

Change-Id: Ie2fec03fa1ef5a7f73c50e5badf8b8ab863728b4
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-28 08:39:59 +02:00
João Abecasis
03a7a9055d Fix typo with impact on test output
If the test fails here, output the values actually used in comparison.

Change-Id: Ie4ed5ebdf1951c02b89a9648aee50a99d0bb0628
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-28 08:39:49 +02:00
Jędrzej Nowacki
82d4c4a039 Add missing to gui/kernel benchmarks.
kernel.pro was not updated.

Change-Id: Ibe11aaf5d6e788dacd2a2d33088fb9445334fb4e
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
2014-07-28 08:39:33 +02:00
Jędrzej Nowacki
21a58910b2 Remove useless QMetaType benchmarks
Cost of a type lookup for core built-in types is really small, just few
cpu instructions, but the benchmark was testing create() and destroy()
functions (in a different fashion) which by definition allocate and
de-allocate memory. These memory operations are significantly more
expensive which obfuscate the results.

Change-Id: I33c679f57e6c2b57e98328f076dfe249ab7bcde8
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Stephen Kelly <steveire@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-28 08:39:29 +02:00
Konstantin Ritt
dc4dfe4ffa A basic justification algorithm for HarfBuzz-NG
This does mostly the same HB-old did, except of non-BMP codepoints
support and better handling of space and punctuation characters.

Change-Id: Iaf8565a35f27d5f4837128cec345eff3d9d2bdf0
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
2014-07-27 22:31:39 +02:00
Marc Mutz
8b4635d895 Clean up tst_QPalette
Remove ctor, dtor, and empty test functions.

Change-Id: I0cf60732258c4470f40ddb258d87f0ac2de64edf
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
2014-07-26 21:13:48 +02:00
Friedemann Kleint
da6aac0950 Windows: Use common code paths for default font families.
Factor out function to determine the font family for a style
hint and use that for the FreeType font database as well.

Task-number: QTBUG-39961
Change-Id: Ic5ec0928c7994b61e4d2b10d829826658b1aa1d5
Reviewed-by: Björn Breitmeyer <bjoern.breitmeyer@kdab.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
2014-07-26 11:30:43 +02:00
David Faure
fd331a5b3a QUrl: fromLocalFile(QString()) should lead to an empty URL.
This is much more useful than the URL "file:", it allows to use
"empty path" and "empty URL" for the same meaning (e.g. not set).

QFileDialog actually uses "file:" though, as the URL for the
"My Computer" item in the sidebar. This patch preserves that.

[ChangeLog][QtCore][QUrl] QUrl::fromLocalFile now returns an empty URL
if the input string is empty.

Change-Id: Ib5ce1a3cdf5f229368e5bcd83c62c1d1ac9f8a17
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-26 09:49:33 +02:00
Thiago Macieira
63efdf9851 Use the 3-argument testAndSet in the fetchAndXxx operations
Saves us from an extra load in the loop when the result is already
there.

Change-Id: Ib65b5b13f27975b8fc88be9b888c19505bf5e07c
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
2014-07-25 18:02:06 +02:00
Alex Trotsenko
324351f6c9 Integrate tst_bench_qringbuffer into the build tree.
Change-Id: Id1d091889c3ba5e343d1237f016fdc22f7dfe413
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-25 17:50:30 +02:00
Thiago Macieira
0c05e7975b Remove non-existing function.
Change-Id: I1c201453d069dbc3d981e1ff3789570af09b662c
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
2014-07-25 17:49:26 +02:00
Thiago Macieira
1f0823cc27 Rewrite simd.prf to share more code
This was a long-time coming.

One innovation from this commit is that it will add the source to
SOURCES if the compiler is already generating code for that specific
target. That is currently always the case for Neon, and the MIPS DSPs
since that is the only condition in which configure will enable those
targets. And because of qt_module.prf, it's also always the case for
SSE2 (but not for SSE3 or higher).

So simplify the .pri files by removing always-true conditions.

Change-Id: Ib24af74717b652c9a6be246e3c17a839470f37da
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
2014-07-25 17:48:53 +02:00
Thiago Macieira
86ac3a98b5 Restore Neon "detection" in Qt
We don't actually detect whether the compiler can create Neon code or
provides Neon intrinsics. Most of them do, so that test would be mostly
moot. We removed the detection previously because we couldn't
automatically enable Neon due to leakage of instructions outside the
areas protected at runtime.

Instead, we rely on the mkspec properly passing the necessary flags that
enable Neon support.

This commit does not change that. All it does is verify whether the arch
detection found "neon" as part of the target CPU features. In other
words, it moves the test that was in simd.prf to configure.

It does fix the Neon detection in configure.exe, which was always
failing for trying to run a test that didn't exist
(config.tests/unix/neon).

Change-Id: Id561dfb2db7d3dca7b8c29afef63181693bdc0aa
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-25 17:48:39 +02:00
Thiago Macieira
875ba6e80c Use simd.prf for building MIPS DSP code
No need to duplicate the extra compiler code.

Change-Id: Ic5656d2f4500c19e0428a7eec1cbcef6c353e99b
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-25 17:48:39 +02:00
Thiago Macieira
1602a091c6 Fix compilation on ARM without ARMv6T2
The "rbit" instruction requires ARMv6T2 or higher. This was found in the
CI when building the imx6 target:

Compiler: arm-poky-linux-gnueabi-g++
Flags: -mfloat-abi=hard -mfpu=neon
Errors from the assembler:
  {standard input}:3078: Error: selected processor does not support ARM mode `rbit r3,r3'
  {standard input}:7341: Error: selected processor does not support ARM mode `rbit ip,ip'

That compiler defaults to ARMv5T. That's obviously wrong for an i.MX 6,
which is a Cortex-A9 (ARMv7), but the correction applies for older
processors.

Change-Id: I56c276fa411977dd7cd867d62adf021e4909302c
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
2014-07-25 17:48:14 +02:00
Jędrzej Nowacki
9f5f3bcbc1 Remove redundant static_cast from QVariantAnimation
QVariant::convert accepts int as an argument, there was no need to cast.

Change-Id: I774c9567972860d887e17acb91ec332ffcebd9d5
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
2014-07-25 15:58:28 +02:00
Friedemann Kleint
5c275b2751 tst_qgraphicsproxywidget: Fix widget leaks.
Change-Id: I953e308e2380c87a69ca1d22e6ac036c57deccda
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
2014-07-25 15:37:10 +02:00
Friedemann Kleint
2bf4c3db31 tst_qmdiarea: Fix widget leaks.
Change-Id: If2ecf2c080f9eb8416b9a3d4104584681862c266
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
2014-07-25 15:37:03 +02:00
Jędrzej Nowacki
364cf0bf20 Fix QJsonValue comparison.
QJsonValue, while comparing two QJsonArrays, should consult also length
of the arrays, because a different than null base pointer doesn't mean
that an array is not empty.

Change-Id: If76739355a4e74b842e836289565f98d95c006d5
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2014-07-25 15:25:43 +02:00
Jędrzej Nowacki
77d7348be2 Fix QJsonValue comparison.
QJsonValue, while comparing two QJsonObjects, should consult also length
of the objects, because a different than null base pointer doesn't mean
that an object is not empty.

Change-Id: Ibee1849ef9fed15d32f2c8f2aad9b053846e46b7
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2014-07-25 15:25:29 +02:00
Jędrzej Nowacki
20cf632ad5 Reading QJsonObject property should not modify the object itself.
Before this change such code:

    QJsonObject o;
    o["blah"];

would create property "blah" and assign null value to it, while
this code:

    const QJsonObject o;
    o["blah"];

would not. The change unifies the confusing behavior. Now reading
a non-existing property, is not causing a property to be added
in any visible way.

Internally QJsonObject stores a special hash of undefined, but
referenced values. Such reference is supposed to not live long,
only to the first compacting or assignment.

Change-Id: Ib022acf74ff49bad88d45d65d7093c4281d468f1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2014-07-25 15:25:17 +02:00
Jędrzej Nowacki
c8edde3b83 Fix QJsonObject const index operator
The operator should always return an undefined values for an empty
object

Change-Id: Ic38f7660d77c64b2d001967bc5109df4185db74a
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2014-07-25 15:25:05 +02:00
Jędrzej Nowacki
ce14208c38 Reduce QtCoreLib size by not repeating "UTC" string too often.
It is a minor reduction, in release build it is ~200 bytes

Change-Id: I4f7972c95769f2e0ca1ddc935ff7a0a6b4379e2a
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-25 15:22:15 +02:00
João Abecasis
5026835690 Re-implement QVector::count
There is no need for a custom algorithm as we can use
std::count

Change-Id: Id1ab514c7cd8f52efe49b27712121415d7ca4455
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-25 15:21:46 +02:00
Friedemann Kleint
03ff5b35a5 tst_qwidget: Fix top level widget leaks.
Fix tests widgets leaking widgets and ensure it stays
that way by adding a check to cleanup().

Task-number: QTBUG-38858
Change-Id: I77a81d823c68cf0b4e51c2da55b1c473d6e4170b
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
2014-07-25 15:14:27 +02:00
Laszlo Agocs
6a80215859 Enable building ANGLE with D3D11 in -opengl dynamic builds.
Task-number: QTBUG-40193
Change-Id: If70943355d650cd3f20f4ff25fa09417a28a2b93
Reviewed-by: Andrew Knight <andrew.knight@digia.com>
2014-07-25 15:14:01 +02:00
Giuseppe D'Angelo
b84699ae1b QRegularExpression: make optimize() const
Although it may seem strange that such a method is const,
optimizing doesn't affect the user-visible part of the object.

Moreover, *not* having it const makes it asymmetrical with other
methods (such as match()) which are const, and under certain
conditions optimize as well.

Change-Id: I0cd8d4a6909d00629fcc65c1c3a1f011f31db782
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
2014-07-25 11:22:54 +02:00
Robin Burchell
972a653a86 QtDBus: Warn if blocking calls take too long.
Blocking DBus calls have the potential to totally wreck user interactivity at
best (actions taking too long) and make things appear completely broken at worst
(the default timeout is 30 seconds, which is a huge amount of time, especially
if you get unfortunate and have a repeated blocking call).

Provide a warning when a call is found that takes too long, based on some preset
durations (200ms for the main thread, 500ms for other threads on the basis that
the main thread is generally more important).

Also provide configuration knobs for these environment variables, in miliseconds:
setting them to 0 will warn on all blocking DBus calls. Setting them to -1 (the
default, on release builds) will disable the warning.

[ChangeLog][QtDBus] Blocking calls that take a long time will now generate a
warning. The time taken may be tuned using the environment variables
Q_DBUS_BLOCKING_CALL_MAIN_THREAD_WARNING_MS and
Q_DBUS_BLOCKING_CALL_OTHER_THREAD_WARNING_MS. The value represents (in
milliseconds) how long before a blocking call is warned on. A value below zero
disables the warning, a value of zero will warn on all blocking calls.

Change-Id: I0ab4c34aa01670a154d794d9f2694b3235e789db
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-25 04:01:03 +02:00
Friedemann Kleint
63da7db055 QLineEdit: Emit textEdited() when the clear button is clicked.
[ChangeLog][QtWidgets][QLineEdit] The signal textEdited() is now
emitted when the user clicks the clear button created by
setClearButtonEnabled() as well.

Task-number: QTBUG-40287
Change-Id: Iacd303ffd1533f27cfa68a6120cdd370e3d31ddc
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2014-07-24 22:12:29 +02:00
Frederik Gladhorn
a1d2bf257e Merge "Merge remote-tracking branch 'origin/5.3' into dev" into refs/staging/dev 2014-07-24 22:37:52 +02:00
Sean Harmer
223f5c0273 Add missing 8_8_8_8 pixel types to QOpenGLTexture
Task-number: QTBUG-36843
Change-Id: Ief4ab9b00b075abe2e04c6d29c8d1279406b5033
Reviewed-by: Liang Qi <liang.qi@digia.com>
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
2014-07-24 21:00:20 +02:00
Friedemann Kleint
f70031c17b Add checks for widget/window leaks to kernel tests.
Change-Id: I52af87279e37e49ce2206c5c823fe8fb4caef338
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
2014-07-24 19:39:40 +02:00
Olivier Goffart
8d15068911 QSettings: use QSaveFile and QLockFile to write the settings
The old unix locking code is no longer working on unix since it locks on
a file descriptor, but QSaveFile creates a new file, and as a result we
get the lock on the wrong file. Also there is no need to keep the lock
held only for reading as QSaveFile is atomic. It just needs to be held
when doing a read before writing.

As a result, since we don't hold the same lock, there could be a race
with an application running an older version of Qt if they are writing
on the same configuration file.

[ChangeLog][QtCore][QSettings] Fixed data loss while writing the config
to the disk fails.

[ChangeLog][Important behavior changes] The locking mechanism inside
QSettings has changed and is no longer compatible with the one of
previous versions of Qt. There might be corruption if two applications
running different versions of Qt are writing to the same config file
at the same time. You must also now have write permissions in the
directory containing the settings file in order to write settings

Task-number: QTBUG-21739
Change-Id: I0844a5e96c8bc1e1222a3dac6cc48170ca77fe1b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2014-07-24 18:50:40 +02:00
Joerg Bornemann
d97624845a get rid of pointless MSVC security warnings
Change-Id: I546a30bddec8e3c5c9a42745f8458573b6db1bdf
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-24 17:37:15 +02:00
Joerg Bornemann
9d12e95697 remove qsystemlibrary.obj from clean target
This file is already listed in QTOBJS.

Change-Id: I5c77620dc5e441435bd31a87a08178e0c82e9c05
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-24 17:37:09 +02:00
Joerg Bornemann
55f88e6e31 fix qmake warning about unknown /Zc:strictStrings option
Make /Zc:strictStrings known to qmake's MSVC compiler option parser.

Change-Id: I5a4494096fc1d67c96c6de52bb0f1e94eff46136
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
2014-07-24 17:36:57 +02:00
Alex Trotsenko
df4f334ad0 Rewrite QRingBuffer
QRingBuffer is a fully inlined class used in many I/O classes.
So, it must be as fast and small as possible. To this end, a lot of
unnecessary special cases were replaced by generic structures.

Change-Id: Ic189ced3b200924da158ce511d69d324337d01b6
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
2014-07-24 17:31:20 +02:00
J-P Nurmi
40705cb4c1 Android: fix Switch & CalendarView text appearances
This reverts the extractTextAppearanceInformations() changes done in
f7ac2b4 and introduces another method extractTextAppearance() for
extracting a specific TextAppearance.

The problem was that extractTextAppearanceInformations() was overriding
the TextAppearance attributes with TextView attributes. This resulted
in wrong text colors for Switch & CalendarView:

- Switch_switchTextAppearance
- CalendarView_dateTextAppearance
- CalendarView_weekDayTextAppearance

Change-Id: Ib300b6eb14649319b2f07012803a4d031a717b50
Reviewed-by: BogDan Vatra <bogdan@kde.org>
2014-07-24 16:26:45 +02:00
David Faure
da088c5ace QFileDialog: emit urlsSelected+urlSelected in accept().
Not just filesSelected+fileSelected (which only happens for local files).

Change-Id: Ife592c3c921231356f96cbc2871b6d724a15d2c8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
2014-07-24 13:02:48 +02:00
Friedemann Kleint
616469bb76 QMainWindow:::restoreDockWidget(): Restore to correct screen.
Use the placeholder top level geometry to determine the
screen.

Task-number: QTBUG-40155
Change-Id: If56b239200e9daf754b0963574367cf7891c5f40
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
2014-07-24 09:05:21 +02:00
Robin Burchell
25978c7f9e Show timing of all executed SQL queries
This also coincidentally fixes logging of prepared queries, which previously
weren't logged.

Change-Id: I41b3559080662284699ac3dfa4fa4236342c61d2
Done-by: John Brooks <john.brooks@jollamobile.com>
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
2014-07-24 03:31:14 +02:00
Thiago Macieira
4fcd5a3da9 Make QTextStream respect QLocale with OmitGroupSeparators
The default in QTextStream is to use the C locale, so default
QTextStream are not affected. When you set a QLocale on it, the default
was to use group separators (which is the QLocale default too). This
commit makes QTextStream respect a QLocale in which the
OmitGroupSeparators option had been set.

Task-number: QTBUG-39956
Change-Id: I00fbe12fca7f0287c7217deb487ded6582a03b52
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
2014-07-24 01:57:32 +02:00
Marc Mutz
46a0a87b2a QInputDialog: simplify signalForMember()
Instead of playing clever tricks with the index variable, simply
scan through the list of argument-carrying signals and, if nothing
fits there, fall explicitly back to accepted().

Change-Id: I1be49ce601edb854cc1bab5be994b2c09fe31b3c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
2014-07-23 20:32:10 +02:00
David Faure
c2cc74f862 tst_qfiledialog: use QStandardPaths test mode
Otherwise, when interrupting the test half-way (e.g. in gdb),
the user's ~/.config/QtProject.conf would be modified.

Change-Id: Id582c4a3fbf0acbed460126fccf0d39b3a09758a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
2014-07-23 20:05:32 +02:00