Commit Graph

2687 Commits (9ceedd586321a2eeac4b63ee90d4e9726e143b78)

Author SHA1 Message Date
Ulf Hermann 9ceedd5863 Make most of QMetaTypeInterface constexpr
The only thing we need to modify at runtime is the typeId and that can
be mutable. This way we can have a constexpr ctor for QMetaType which
hopefully makes the importing and exporting of related symbols less
fickle.

On Windows we cannot make QMetaTypeForType constexpr as that leads to
mysterious errors in other places. Until we figure out why that is, we
just leave this class as non-constexpr.

This reveals that qcoreapplication.h and qvariant.h are using QDebug
without including it. We now get template instantiation errors. Include
qdebug.h to avoid that.

Change-Id: If1bf0437ada52459c59c6fa45bab3d22dfb0bc92
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2020-10-18 13:48:16 +02:00
Tor Arne Vestbø 40e6fe7801 doc: Update and flesh out native interface docs
The namespace and overviews are in the qtdoc repository.

Docs for individual interfaces should live with their platform.

Change-Id: Iba5fd7e9ebc4f1f634ec9dc3ec125ce88a1312ba
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-10-18 13:31:09 +02:00
Fabian Kosmale 1f66d914e4 QMutableEventPoint::detach: deref old private
After detaching, the current QMutableEventPoint obviously doesn't
reference old QMutableEventPointPrivate anymore. Deref it, so that we
do not leak memory.

Change-Id: I3b59667603d41f452eead9a2db13e1d005f622ec
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-10-18 10:42:48 +02:00
Friedemann Kleint 9ed75b6716 QWindowSystemInterface: Add tablet event overloads without timestamps
On some platforms, tablet events do not have a time stamp.

Task-number: QTBUG-46412
Change-Id: I3cc820b1edaaf55511c000fefb805f5a3a7872a6
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-10-17 11:56:41 +02:00
Volker Hilsheimer 833a6e18bf Implement move and comparison operators for QEventPoint
QEventPoints are equal when all data values are equal, the
refcount is ignored.

Change-Id: I6ef70faf0b12129eaa22bfc1f0a45bab2422d421
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-10-17 08:21:52 +02:00
Giuseppe D'Angelo 35c565e965 Port some more /*implicit*/-like comments to Q_IMPLICIT
Change-Id: Ib70ad3f29365153af647deea54fc45467c413cb9
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2020-10-16 01:07:31 +02:00
Volker Hilsheimer 2cc8d801aa Unwrap private QPalette data member
Following 556511f9f3, there is only one
data member in addition to the shared QPalettePrivate, so we don't need
a data struct anymore.

Change-Id: I8d7f33ed042e47464eb5f60a048956f8bf70e0b9
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-10-14 23:43:38 +02:00
Tor Arne Vestbø 705837771c Add a few missing Q_CLANG_QDOC for native interfaces
Change-Id: I5dbe2f7e7c03fb0a130b2da373f6f6a642d57575
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
2020-10-13 16:39:32 +02:00
Tor Arne Vestbø 7e271686a7 Exclude all modifiers as candidates for shortcuts
If we're going to limit shortcuts to non-modifiers, we should
at least include all of the modifiers, otherwise we'll end up
passing through e.g. Key_CapsLock.

Change-Id: If11758f85d06f75e9b9c2d2a57d4a4915ff72317
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
2020-10-12 15:23:15 +02:00
Lars Knoll 92b7122eda Remove dead code
This code has been deprecated in Qt 5.

Change-Id: Ia8e0bc791ac1f43df7124b4f30db3d0bb9966015
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
2020-10-12 14:49:50 +02:00
Allan Sandfeld Jensen 96eea43d3b Do not trigger actions disabled directly or on group level
Only allow actions disabled due not being visible to trigger, when
enabled is not true.

This matches QQuickAction behavior, and doesn't apppear to affect QtGui
or QtWidgets.

Change-Id: I1a00b80213598ef1560be4c9ee9e65cd6fa6d760
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-10-08 09:01:11 +00:00
Allan Sandfeld Jensen 564b59d903 Another round of replacing 0 with nullptr
This time based on grepping to also include documentation, tests and
examples previously missed by the automatic tool.

Change-Id: Ied1703f4bcc470fbc275f759ed5b7c588a5c4e9f
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
2020-10-07 23:02:47 +02:00
Tor Arne Vestbø 0efe79f80d Rename the new platform APIs from QPlatformInterface to QNativeInterface
We were already using the 'native' nomenclature when referring to these
kinds of APIs, e.g. when talking about native handles, or the existing
QPlatformNativeInterface on a QPA level. Using 'native' for the user
facing APIs also distinguishes them from the 'platform' backend layer
in QPA and elsewhere.

Change-Id: I0f3273265904f0f19c0b6d62471f8820d3c3232e
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-10-07 13:03:27 +02:00
Tor Arne Vestbø 4ef7985352 Rename Android offscreen surface interface
The convention for these interfaces is to not have 'platform' in
their name.

Change-Id: I4af831861b58dcfc2538d4206788231b9ec3a766
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
2020-10-07 13:03:27 +02:00
Tor Arne Vestbø 57d6f842ea Un-special-case macOS in handling of QKeyEvent::nativeScanCode()
In the porting from Qt 4 to Qt 5 an assumption was made in QKeyMapper
that the underlying platform implementation needed the native scan
code to be able to resolve the possible keymaps for an event.

As a result, the macOS platform plugin started sending key events
with a fake native scan code of 1, so that it would still be allowed
to map key events.

Which in turn led to the documentation of QKeyEvent::nativeScanCode()
getting an exception for macOS.

Let's clean up this by removing the original assumption, and leave it
up to the platforms to decide what information from the key event
is needed.

QKeyMapperPrivate::possibleKeys() will still call extractKeyFromEvent
as a fallback if the platform layer doesn't return any possible keys.

Change-Id: I122a45bcec658c45ccc0b2c0671eb264d85d7be6
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
2020-10-06 11:20:49 +02:00
Lars Knoll fa8d021fa6 Convert a couple of APIs to use views
Try to get rid of APIs that use raw 'const {char, QChar} *, length'
pairs. Instead, use QByteArrayView or QStringView.

As QStringConverter is a new class, simply change the API to what we'd like
to have. Also adjust hidden API in QStringBuilder and friends.

Change-Id: I897d47f63a7b965f5574a1e51da64147f9e981f6
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-10-06 11:16:36 +02:00
Allan Sandfeld Jensen 00807f1fe5 Simplify QAction privates
List primary and alternative key sequences and ids together, making the
logic cleaner.

Change-Id: I4eb07f9828f2b15dc66c34ceb2c4f800df73e800
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-10-06 09:41:31 +02:00
Morten Johan Sørvig 227fa93c27 Give QPlatformPlaceholderScreen a DPR of 1
Use the default logicalDpi() implementation, which now
returns logicalBaseDpi() and ensures a default device
pixel ratio of 1.


Change-Id: Idd408261c90b112a093c82695ff9e0078e90ac41
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-10-06 09:22:03 +02:00
Morten Johan Sørvig f84ba3108c Remove QPlatformScreen::pixelDensity()
This function is no longer in use - Qt Gui now computes
scale factors based on logicalDpi() and logicalBaseDpi()
instead.

Change-Id: Ieb4b75ef4e1563694a8e12b7cdd1f60c419d5bf2
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-10-05 10:58:00 +02:00
Morten Johan Sørvig 9103d82d01 Make the logicalDpi() default implementation return 96
Remove the code which calculates physical DPI and
call logicalBaseDpi() instead.

This will make sure that Qt gets a device pixel ratio
of 1.0 by default, for the cases where the platform
plugin does not implement logicalDpi() itself.

Task-number: QTBUG-87035
Change-Id: I08433c9465be03d27b3decccb0e2e7e5e6aff0ae
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-10-05 08:57:54 +00:00
Giuseppe D'Angelo 889d40ebe2 Centralize the implementation of move assignment operators
At the moment we have two main strategies for dealing with move
assignment in Qt:

1) move-and-swap, used by "containers" (in the broad sense): containers,
but also smart pointers and similar classes that can hold user-defined
types;

2) pure swap, used by containers that hold only memory (e.g. QString,
QByteArray, ...) as well as most implicitly shared datatypes.

Given the fact that a move assignment operator's code is just
boilerplate (whether it's move-and-swap or pure swap), provide two
_strictly internal_ macros to help write them, and apply the macros
across corelib and gui, porting away from the hand-rolled
implementations.

The rule of thumb when porting to the new macros is:

* Try to stick to the existing code behavior, unless broken

* if changing, then follow this checklist:

  * if the class does not have a move constructor => pure swap
    (but consider ADDING a move constructor, if possible!)

  * if the class does have a move constructor, try to follow the
     criteria above, namely:

    * if the class holds only memory, pure swap;

    * if the class may hold anything else but memory (file handles,
      etc.), then move and swap.

Noteworthy details:

* some operators planned to be removed in Qt 6 were not ported;

* as drive-by, some move constructors were simplified to be using
qExchange(); others were outright broken and got fixed;

* some contained some more interesting code and were not touched.

Change-Id: Idaab3489247dcbabb6df3fa1e5286b69e1d372e9
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
2020-10-03 11:47:17 +02:00
Steffen Kieß 63bbbdc4b8 Ignore mouse events where globalPos contains NaN
A NaN value in globalPos can cause an endless recursion in
QGuiApplicationPrivate::processMouseEvent() when e->enhancedMouseEvent()
is true and this is not a move event.

When an event contains a NaN in globalPos, print a warning and ignore
the event.

Pick-to: 5.15
Fixes: QTBUG-86207
Change-Id: I8789e465921789569715e52c98193f91945ea982
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-10-02 23:12:07 +02:00
Shawn Rutledge f51e6552e3 End touch->mouse synthesis when the chosen touchpoint is released
During delivery of a TouchBegin event, if no widget accepts it,
we begin treating the first touchpoint as a synth-mouse, as before.
If a second touchpoint is pressed or released in any order, it's
irrelevant: the fake mouse button is released as soon as the first
touchpoint is released.  This fixes the bug that such a scenario
caused the mouse release not to be sent, so that a widget could get
"stuck" in pressed state.

Done-with: Tang Haixiang <tanghaixiang@uniontech.com>
Fixes: QTBUG-86253
Pick-to: 5.15
Change-Id: I7fbbe120539d8ded8ef5e7cf712a27bd69391e02
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-10-02 14:17:44 +02:00
Shawn Rutledge 871d19a5b9 Treat a double-click event as an update event with stationary point
The sequence is still press, release, press, double-click, release.
isBeginEvent() should not be true for a double-click event: the second
click began with a normal MouseButtonPress, and the MouseButtonDblClick
event is a way of sending updated state to tell the recipient that the
second click was special, occurring within such spatial and temporal
constraints that it can be interpreted as a double-click.
It never has a different position either, because MouseButtonDblClick
is a synthetic event occurring at the same position as the second press;
so we might as well say its QEventPoint is Stationary.

Together, these changes fix tst_controls::Basic::DelayButton::test_mouse
in Controls 2, without any changes in qtdeclarative.
In QQuickWindowPrivate::deliverPointerEvent(), if isBeginEvent() == true,
it delivers to all items under the point position(s) first, and then if
all _updated_ points were not accepted, it continues delivery to grabbers;
whereas if isBeginEvent() == false, it delivers only to grabbers.
isBeginEvent() and QEventPoint::state() are important to that algorithm.

Amends 6d6ed64d6c

Task-number: QTBUG-87018
Change-Id: I95def9704652147540df5cc065354a0fe04ed626
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-30 23:17:50 +02:00
Allan Sandfeld Jensen cc692bb58c Get rid of some #ifdef qt6
None of this code is even compiled in qt6.

Change-Id: I5891cc9459320083ad3908fcbf646f3ba75b8a4d
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2020-09-30 21:15:40 +02:00
Friedemann Kleint 5c7307775d Emit QScreen::geometryChanged when the logical DPI changes
Add the missing call to QScreenPrivate::emitGeometryChangeSignals()
along with an emission of physicalDotsPerInchChanged()
since that is calculated from geometry and physical size.

Rearrange the code in
QGuiApplicationPrivate::processScreenGeometryChange()
to prevent duplicate emissions of geometryChanged(),
physicalDotsPerInchChanged() which this change would introduce.

Amends 5290027e3b.

Pick-to: 5.15
Task-number: QTBUG-76902
Task-number: QTBUG-79248
Fixes: QTBUG-86604
Change-Id: I3dc2ec5ccd9c6413e92f9246242f323e8afc5e57
Reviewed-by: David Edmundson <davidedmundson@kde.org>
2020-09-30 15:16:58 +02:00
Allan Sandfeld Jensen 66c8fc4831 Fix assumed version typo
Deprecated from 6.0, but necessary for migration.

Change-Id: Idb1264e6ecca9400086970c15270b803c8fd391b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-30 00:10:54 +02:00
Volker Hilsheimer 7083ddb582 Fix qdoc warning: button(s) are members of QSinglePointEvent
... and documented there already.

Change-Id: Ie66362d3b668caf93b100befef08bc91ae8add2f
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-09-27 14:09:47 +02:00
Johan Klokkhammer Helsing 400fb27208 Use WAYLAND_DISPLAY and DISPLAY instead of XDG_SESSION_TYPE
XDG_SESSION_TYPE is a non-standard part of systemd, and not set if you
run a compositor from the command line, for instance.

[ChangeLog][Wayland] XDG_SESSION_TYPE is no longer used to determine which
platform plugin to use. Instead, if WAYLAND_DISPLAY is set in the environment,
wayland is used. Similarly, if DISPLAY is set, xcb is used. If both are
detected, wayland will be attempted first, then xcb.

Gnome-shell is still skipped for automatic wayland detection.

Fixes: QTBUG-75732
Change-Id: Ieed123330662dc29eafa31148a9b99ba0810de90
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
2020-09-27 09:30:53 +02:00
Allan Sandfeld Jensen c2be9180b7 Replace Q_REQUIRED_RESULT with [[nodiscard]]
It was already used many places directly making the code inconsistent.

Change-Id: I3b14bc6c333640fb3ba33c71eba97e78c973e44b
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-25 07:10:45 +02:00
Shawn Rutledge 1783b048fd Get rid of QMutableEventPoint::stationaryWithModifiedProperty
Omitting stationary points from touch events is such a marginal
optimization that this code probably isn't worth maintaining.
It wasn't implemented correctly this time either, according to the
tst_QQuickMultiPointTouchArea::stationaryTouchWithChangingPressure()
test.

[ChangeLog][QtGui][QPointerEvent] We no longer attempt to avoid
delivery of stationary points within QTouchEvent: every pressed point
is now included in every TouchUpdate event.

Task-number: QTBUG-77142
Change-Id: If1fd666fb3057a17e0dffdd7ca7138693126b02b
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-25 06:51:32 +02:00
Volker Hilsheimer ca6ac03845 Fix some qdoc warnings: undocumented parameters
Change-Id: I5d37f620caccbd1445c99a602b71779bdedd37d3
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-09-25 04:42:27 +02:00
Alexander Volkov 7c483a251b Simplify QHighDpi::fromNativeLocalExposedRegion()
... by using QRectF::toAlignedRect().

Change-Id: I310b2f0ad87c541aa0d63d6a8061783aff791abb
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
2020-09-23 18:34:02 +03:00
Volker Hilsheimer adb927e5bc Fix documentation of QPointerEvent::points
As drive-by, fix qdoc warning in related internal documentation.

Change-Id: I7716a9b126e38e99dcd11c6af2e91b8ec7bf4346
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-23 06:06:33 +02:00
Volker Hilsheimer 1e2325f0dc Fix some qdoc warnings: typos and qdoc syntax
Change-Id: Idf5c1490330e0f2e5d4bcf920eb03fc9993b3c8a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-22 06:01:02 +02:00
Lars Knoll 848927b688 Cleanup API of QMimeData
Do not use QVariant::Type anymore, instead use QMetaType

For some reason, this pushed the qvariant autotest over the limit where
MSVC requires the /bigobj flag, so add that one.

[ChangeLog][QtCore][QMimeData] The signature of the virtual retrieveData()
function has changed and now takes a QMetaType instead of a QVariant::Type.

Change-Id: Ib46773bd731ee2177b1ef74d8162d744be7017ef
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
2020-09-21 14:56:09 +02:00
Shawn Rutledge 1a3863147d Emit CancelGrabExclusive when one grabber is replaced by another
Qt Quick Pointer Handlers depend on this behavior:
QQuickPointerHandler::onGrabChanged() receives only the grabber that
was losing the grab or the one that is receiving it, not both at the
same time.  UngrabExclusive means the original grabber simply
relinquished the grab by setting the exclusive grabber to null.
CancelGrabExclusive means the new grabber took over the grab that the
old grabber had before.

Task-number: QTBUG-86729
Change-Id: Iefca6fe91b11fcb03d2c6ac3598841c924facb22
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-18 20:11:51 +00:00
Eskil Abrahamsen Blomfeldt f3ecac059d Fix running with placeholder screen and high-dpi enabled
After we started defaulting to high-dpi enabled, it was discovered
that it does not work correctly with the placeholder screen. Since
the placeholder screen has no physical size, and the default
implementation of logicalDpi() divides by the physical size, we
got a scale factor of NaN in the high-dpi code.

The effect of this was that the nooutput test in Qt Wayland would
fail, because it did not get the events it was expecting, since
the window geometry was never set to a valid rect in the
resize() call.

Task-number: QTBUG-86698
Change-Id: I7ee68db9a13446b414502ae0f26fd214531c673a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-18 07:44:22 +02:00
Shawn Rutledge 153dcfbbba Rename is[Begin|Update|End]Event, reimplement in QWheelEvent
These states correspond well with ScrollPhase, and this abstraction
makes it possible to handle wheel events the same way as mouse events
in Qt Quick: on "begin" we deliver to all Items and Handlers until
all points (the only point) are accepted; on "update" and "end" we
deliver only to the exclusive grabber, if there is one, and to any
passive grabbers.

Change-Id: I702dbd4f2c1bf5962eb3dbb9e4b725300a00a887
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-17 19:03:24 +02:00
Volker Hilsheimer 861c4d8548 Deprecate implicit QPixmap conversion to QBitmap
It is lossy, so should be requested explicitly, using a dedicated
fromPixmap factory function.

Deprecate the constructor and assignment operator, and make the
constructor explicit.

[ChangeLog][QtGui][QBitmap] Implicitly constructing and assigning
to a QBitmap from a QPixmap has been deprecated, and the respective
constructor has been made explicit. Use the fromPixmap factory
function instead.

Change-Id: I68ce85b26c901415137b664a1db687021d48bae0
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-17 13:26:50 +02:00
Shawn Rutledge b850322147 QPointingDevPriv::setExclusiveGrabber: emit grabChanged with point found
...not with the given point.  Since QEventPoint has a constructor that
takes an id, it's possible to write something like
 pointerEvent->setExclusiveGrabber(pointId, object)
which will construct a QEventPoint on-the-fly, containing only an id.
(That was unintentional, but perhaps useful sometimes.)
setExclusiveGrabber() looks up the persistent point, but if we emit the
signal with the given point, it is missing the device.  A handler
connected to that signal might reasonably assume that the point is a
complete instance; so we'd better emit the complete instance that we
found.  (OTOH if the given point was a detached instance, it might also
be unexpected that the signal emits the persistent instance instead of
the given instance.)  Amends 2692237bb1

Change-Id: Iee16363dcb22c1dc07b0cc0a81930218e22fa19e
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-17 04:21:33 +02:00
Shawn Rutledge 8932e80d0c Add more QPointerEvent functions needed in Qt Quick
Change-Id: I87a874477b89eb3f5951930f03e305d896a24c2e
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-17 04:20:58 +02:00
Shawn Rutledge a54988c822 Mouse->touch synthesis: send touch event with mouse device
In 4e400369c0 we began to send synth-mouse
events from the touch device, but in the opposite direction it was not
consistent.

Add autotests to prove that it's consistent both ways now.

Change-Id: I7df2328fef224dc1529ca5d27411cd8a5a9c8df9
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-16 14:47:45 +02:00
Shawn Rutledge 1fdbbb49d9 Calculate velocity in QMutEventPoint::setTimestamp() with Kalman filter
This functionality was only in Qt Quick in Qt 5.  Now we move it up to QtGui
so that every QEventPoint will have a valid velocity() before being delivered
anywhere.

[ChangeLog][QtGui][QPointerEvent] Every QEventPoint should now carry a valid
velocity(): if the operating system doesn't provide it, Qt will calculate it,
using a simple Kalman filter to provide a weighted average over time.

Fixes: QTBUG-33891
Change-Id: I40352f717f0ad6edd87cf71ef55e955a591eeea1
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-16 14:47:36 +02:00
Shawn Rutledge 2692237bb1 Track grab state in QPointingDevicePrivate::activePoints
QQuickEventPoint instances were very long-lived and got reused from one
event to the next.  That was initially done because they were "heavy"
QObjects; but it also became useful to store state in them between
events. But this is in conflict with the ubiquitous event replay
code that assumes it's OK to hold an event instance (especially
a QMouseEvent) for any length of time, and then send it to some widget,
item or window. Clearly QEventPoints must be stored in the QPointerEvent,
if we are to avoid the need for workarounds to keep such old code working.
And now they have d-pointers, so copying is cheap. But replay code
will need to detach() their QEventPoints now.

QEventPoint is useful as an object to hold state, but we now store
the truly persistent state separately in an EventPointData struct,
in QPointingDevicePrivate::activePoints. Incoming events merely
update the persistent points, then we deliver those instead.
Thus when event handler code modifies state, it will be remembered
even when the delivery is done and the QPA event is destroyed.

This gets us a step closer to supporting multiple simultaneous mice.

Within pointer events, the points are moved up to QPointerEvent itself:
 QList<QEventPoint> m_points;
This means pointCount(), point(int i) and points() can be non-virtual.
However in any QSinglePointEvent, the list only contains one point.
We hope that pessimization is worthwhile for the sake of removing
virtual functions, simplifying code in event classes themselves, and
enabling the use of the range-for loop over points() with any kind of
QPointerEvent, not just QTouchEvent. points() is a nicer API for the
sake of range-for looping; but point() is more suited to being
non-const.

In QML it's expected to be OK to emit a signal with a QPointerEvent
by value: that will involve copying the event.  But QEventPoint
instances are explicitly shared, so calling setAccepted() modifies
the instance in activePoints (EventPointData.eventPoint.d->accept);
and the grabbers are stored separately and thus preserved between events.
In code such as MouseArea { onPressed: mouse.accepted = false }
we can either continue to emit the QQuickMouseEvent wrapper
or perhaps QEvent::setAccepted() could become virtual and set
the eventpoint's accepted flag instead, so that it will survive
after the event copy that QML sees is discarded.

The grabChanged() signal is useful to keep QQuickWindow informed
when items or handlers change exclusive or passive grabbers.

When a release happens at a different location than the last move event,
Qt synthesizes an additional move.  But it would be "boring" if
QEventPoint::lastXPosition() accessors in any released eventpoint always
returned the same as the current QEventPoint::xPosition()s just because
of that; and it would mean that the velocity() must always be zero on
release, which would make it hard to use the final velocity to drive an
animation.  So now we expect the lastPositions to be different than
current positions in a released eventpoint.

De-inline some functions whose implementations might be subject to
change later on.  Improve documentation.

Since we have an accessor for pressTimestamp(), we might as well add one for
timestamp() too.  That way users get enough information to calculate
instantaneous velocity, since the plan is for velocity() to be somewhat
smoothed.

Change-Id: I2733d847139a1b1bea33c00275459dcd2a145ffc
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-16 11:33:03 +02:00
Allan Sandfeld Jensen 9815ebf24b Switch QSurfaceFormat::colorSpace to a QColorSpace
Allows more flexibility in the future.

Change-Id: Idcf2d8ddaee268a7b5d55379ccb42dd9b3c33abf
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2020-09-15 01:41:13 +02:00
Shawn Rutledge db07a20355 Remove QPointerEvent::isPointAccepted() and setPointAccepted()
They are redundant, not in use, and got added without implementation in
a81859a3c8.

Change-Id: Ifed1fbf97a8158c2801df09dac47bf1fc90795d4
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
2020-09-14 17:14:52 +02:00
Tor Arne Vestbø 0c02f133f3 Plumb application quit through platform plugin
If we have a platform plugin we ask the platform to quit, and if
not we fall back to the base implementation of QCoreApplication
that sends Quit events directly.

This allows the platform to involve the rest of the system in the
process. The platform will then come back with a spontaneous quit
via QWSI::handleApplicationTermination(), which will then send
the corresponding Quit even from QGuiApplication like normal.

Task-number: QTBUG-45262
Task-number: QTBUG-33235
Task-number: QTBUG-72013
Task-number: QTBUG-59782
Change-Id: I0000aaf7192e4b905933c5da0e53901c6c88f26a
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-14 12:41:00 +02:00
Topi Reinio e1ce78d484 Doc: Fix documentation issues for event and input device classes
* Document the new base classes QPointerEvent and QSinglePointEvent,
  and move relevant documentation to be located under them.
* Replace linking to deprecated functions with their new counterparts.
* Remove non-existent function and parameter documentation.
* Document QEventPoint::State enum.
* Prefer \obsolete over \deprecated and fix the usage.
* Document the Capabilities enum in the correct location and
  add docs for the missing enum values.

Change-Id: Ic8f2732f2e90ecbf522cd744c601cedcc574825c
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2020-09-10 17:28:11 +02:00
Shawn Rutledge a81859a3c8 Move grabbing API from QEventPoint to QPointerEvent
We plan to move storage of the grabbers into QPointingDevice so that
QEventPoint will store only data that does not need to persist between
deliveries of individual events. These API changes prepare for that.

addPassiveGrabber/removePassiveGrabber is a better API than
setPassiveGrabbers(), because it will never require constructing a
temporary QList just to call the function. Eventually we need to emit
signals to notify about grab changes, so it's better to have incremental
changes to the list rather than needing to iterate and find differences.

Fix up the docs.

QEventPoint IDs are no longer written in hex in debug output.
That was done in Qt 5 because an ID was a composite of device ID
with the OS-provided touchpoint ID; but since the QPointingDevice
is always available, it's more readable if the IDs are in decimal.

Change-Id: I86b9016d9b28c331ca05c7c108d9788de93fb642
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2020-09-10 14:21:47 +02:00