summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2016-04-11 08:48:27 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2016-04-11 09:12:36 +0200
commitf34e73a16a3d757057e007874cb5008f16e20f02 (patch)
treebcc228617cf240773fd09daac1a1a2614b552b68 /src/gui/kernel
parent5380808453728a354ae28aae76e85ac448245cf1 (diff)
parentb9d386f2ccd69c7f6a766a6d90a6024eeb48e90a (diff)
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts: src/corelib/kernel/qobject.cpp src/gui/painting/qpaintengine_raster.cpp Change-Id: I74e1779832f43d033708dcfd6b666c7b4f0111fb
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qguiapplication.cpp8
-rw-r--r--src/gui/kernel/qinputmethod.cpp40
-rw-r--r--src/gui/kernel/qinputmethod.h3
-rw-r--r--src/gui/kernel/qopenglcontext.cpp4
-rw-r--r--src/gui/kernel/qplatforminputcontext.cpp27
-rw-r--r--src/gui/kernel/qplatforminputcontext.h2
-rw-r--r--src/gui/kernel/qwindowsysteminterface.cpp6
-rw-r--r--src/gui/kernel/qwindowsysteminterface_p.h2
8 files changed, 81 insertions, 11 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index c97d3bb61a..9f566213bc 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -2300,9 +2300,17 @@ void QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::T
e->device, e->pointerType, e->pressure, e->xTilt, e->yTilt,
e->tangentialPressure, e->rotation, e->z,
e->modifiers, e->uid, button, e->buttons);
+ ev.setAccepted(false);
ev.setTimestamp(e->timestamp);
QGuiApplication::sendSpontaneousEvent(window, &ev);
pointData.state = e->buttons;
+ if (!ev.isAccepted() && !QWindowSystemInterfacePrivate::TabletEvent::platformSynthesizesMouse
+ && qApp->testAttribute(Qt::AA_SynthesizeMouseForUnhandledTabletEvents)) {
+ QWindowSystemInterfacePrivate::MouseEvent fake(window, e->timestamp, e->local, e->global,
+ e->buttons, e->modifiers, Qt::MouseEventSynthesizedByQt);
+ fake.flags |= QWindowSystemInterfacePrivate::WindowSystemEvent::Synthetic;
+ processMouseEvent(&fake);
+ }
#else
Q_UNUSED(e)
#endif
diff --git a/src/gui/kernel/qinputmethod.cpp b/src/gui/kernel/qinputmethod.cpp
index ca988f2523..b81e166d3a 100644
--- a/src/gui/kernel/qinputmethod.cpp
+++ b/src/gui/kernel/qinputmethod.cpp
@@ -97,6 +97,7 @@ void QInputMethod::setInputItemTransform(const QTransform &transform)
d->inputItemTransform = transform;
emit cursorRectangleChanged();
+ emit anchorRectangleChanged();
}
@@ -126,6 +127,19 @@ void QInputMethod::setInputItemRectangle(const QRectF &rect)
d->inputRectangle = rect;
}
+static QRectF inputMethodQueryRectangle_helper(Qt::InputMethodQuery imquery, const QTransform &xform)
+{
+ QRectF r;
+ if (QObject *focusObject = qGuiApp->focusObject()) {
+ QInputMethodQueryEvent query(imquery);
+ QGuiApplication::sendEvent(focusObject, &query);
+ r = query.value(imquery).toRectF();
+ if (r.isValid())
+ r = xform.mapRect(r);
+ }
+ return r;
+}
+
/*!
\property QInputMethod::cursorRectangle
\brief Input item's cursor rectangle in window coordinates.
@@ -136,18 +150,20 @@ void QInputMethod::setInputItemRectangle(const QRectF &rect)
QRectF QInputMethod::cursorRectangle() const
{
Q_D(const QInputMethod);
+ return inputMethodQueryRectangle_helper(Qt::ImCursorRectangle, d->inputItemTransform);
+}
- QObject *focusObject = qGuiApp->focusObject();
- if (!focusObject)
- return QRectF();
-
- QInputMethodQueryEvent query(Qt::ImCursorRectangle);
- QGuiApplication::sendEvent(focusObject, &query);
- QRectF r = query.value(Qt::ImCursorRectangle).toRectF();
- if (!r.isValid())
- return QRectF();
+/*!
+ \property QInputMethod::anchorRectangle
+ \brief Input item's anchor rectangle in window coordinates.
- return d->inputItemTransform.mapRect(r);
+ Anchor rectangle is often used by various text editing controls
+ like text prediction popups for following the text selection.
+*/
+QRectF QInputMethod::anchorRectangle() const
+{
+ Q_D(const QInputMethod);
+ return inputMethodQueryRectangle_helper(Qt::ImAnchorRectangle, d->inputItemTransform);
}
/*!
@@ -300,6 +316,10 @@ void QInputMethod::update(Qt::InputMethodQueries queries)
if (queries & Qt::ImCursorRectangle)
emit cursorRectangleChanged();
+
+ if (queries & (Qt::ImAnchorRectangle))
+ emit anchorRectangleChanged();
+
}
/*!
diff --git a/src/gui/kernel/qinputmethod.h b/src/gui/kernel/qinputmethod.h
index 68dc679d14..22e4677eaa 100644
--- a/src/gui/kernel/qinputmethod.h
+++ b/src/gui/kernel/qinputmethod.h
@@ -55,6 +55,7 @@ class Q_GUI_EXPORT QInputMethod : public QObject
Q_OBJECT
Q_DECLARE_PRIVATE(QInputMethod)
Q_PROPERTY(QRectF cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
+ Q_PROPERTY(QRectF anchorRectangle READ anchorRectangle NOTIFY anchorRectangleChanged)
Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle NOTIFY keyboardRectangleChanged)
Q_PROPERTY(bool visible READ isVisible NOTIFY visibleChanged)
Q_PROPERTY(bool animating READ isAnimating NOTIFY animatingChanged)
@@ -70,6 +71,7 @@ public:
// in window coordinates
QRectF cursorRectangle() const; // ### what if we have rotations for the item?
+ QRectF anchorRectangle() const; // ### ditto
// keyboard geometry in window coords
QRectF keyboardRectangle() const;
@@ -102,6 +104,7 @@ public Q_SLOTS:
Q_SIGNALS:
void cursorRectangleChanged();
+ void anchorRectangleChanged();
void keyboardRectangleChanged();
void visibleChanged();
void animatingChanged();
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp
index 81c0971ea0..59bf2bb065 100644
--- a/src/gui/kernel/qopenglcontext.cpp
+++ b/src/gui/kernel/qopenglcontext.cpp
@@ -516,8 +516,10 @@ void QOpenGLContext::setScreen(QScreen *screen)
void QOpenGLContextPrivate::_q_screenDestroyed(QObject *object)
{
Q_Q(QOpenGLContext);
- if (object == static_cast<QObject *>(screen))
+ if (object == static_cast<QObject *>(screen)) {
+ screen = 0;
q->setScreen(0);
+ }
}
/*!
diff --git a/src/gui/kernel/qplatforminputcontext.cpp b/src/gui/kernel/qplatforminputcontext.cpp
index bad6422cb8..3f59116e9a 100644
--- a/src/gui/kernel/qplatforminputcontext.cpp
+++ b/src/gui/kernel/qplatforminputcontext.cpp
@@ -43,6 +43,8 @@
#include "private/qkeymapper_p.h"
#include <qpa/qplatforminputcontext_p.h>
+#include <QtGui/qtransform.h>
+
QT_BEGIN_NAMESPACE
/*!
@@ -267,5 +269,30 @@ void QPlatformInputContextPrivate::setInputMethodAccepted(bool accepted)
QPlatformInputContextPrivate::s_inputMethodAccepted = accepted;
}
+/*!
+ * \brief QPlatformInputContext::setSelectionOnFocusObject
+ * \param anchorPos Beginning of selection in currently active window coordinates
+ * \param cursorPos End of selection in currently active window coordinates
+ */
+void QPlatformInputContext::setSelectionOnFocusObject(const QPointF &anchorPos, const QPointF &cursorPos)
+{
+ QObject *focus = qApp->focusObject();
+ if (!focus)
+ return;
+
+ QInputMethod *im = QGuiApplication::inputMethod();
+ const QTransform mapToLocal = im->inputItemTransform().inverted();
+ bool success;
+ int anchor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, anchorPos * mapToLocal).toInt(&success);
+ if (success) {
+ int cursor = QInputMethod::queryFocusObject(Qt::ImCursorPosition, cursorPos * mapToLocal).toInt(&success);
+ if (success) {
+ QList<QInputMethodEvent::Attribute> imAttributes;
+ imAttributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, anchor, cursor - anchor, QVariant()));
+ QInputMethodEvent event(QString(), imAttributes);
+ QGuiApplication::sendEvent(focus, &event);
+ }
+ }
+}
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qplatforminputcontext.h b/src/gui/kernel/qplatforminputcontext.h
index 24c6178541..7afa6b82f2 100644
--- a/src/gui/kernel/qplatforminputcontext.h
+++ b/src/gui/kernel/qplatforminputcontext.h
@@ -95,6 +95,8 @@ public:
virtual void setFocusObject(QObject *object);
bool inputMethodAccepted() const;
+ static void setSelectionOnFocusObject(const QPointF &anchorPos, const QPointF &cursorPos);
+
private:
friend class QGuiApplication;
friend class QGuiApplicationPrivate;
diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp
index abcd6c113b..60b2706d35 100644
--- a/src/gui/kernel/qwindowsysteminterface.cpp
+++ b/src/gui/kernel/qwindowsysteminterface.cpp
@@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE
QElapsedTimer QWindowSystemInterfacePrivate::eventTime;
bool QWindowSystemInterfacePrivate::synchronousWindowSystemEvents = false;
+bool QWindowSystemInterfacePrivate::TabletEvent::platformSynthesizesMouse = true;
QWaitCondition QWindowSystemInterfacePrivate::eventsFlushed;
QMutex QWindowSystemInterfacePrivate::flushEventMutex;
QAtomicInt QWindowSystemInterfacePrivate::eventAccepted;
@@ -948,4 +949,9 @@ QWindowSystemInterfacePrivate::WheelEvent::WheelEvent(QWindow *w, ulong time, co
{
}
+void QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(bool v)
+{
+ platformSynthesizesMouse = v;
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h
index 3ccf815c54..b218c1c68c 100644
--- a/src/gui/kernel/qwindowsysteminterface_p.h
+++ b/src/gui/kernel/qwindowsysteminterface_p.h
@@ -352,6 +352,7 @@ public:
int device, int pointerType, Qt::MouseButtons buttons, qreal pressure, int xTilt, int yTilt,
qreal tangentialPressure, qreal rotation, int z, qint64 uid,
Qt::KeyboardModifiers modifiers = Qt::NoModifier);
+ static void setPlatformSynthesizesMouse(bool v);
TabletEvent(QWindow *w, ulong time, const QPointF &local, const QPointF &global,
int device, int pointerType, Qt::MouseButtons b, qreal pressure, int xTilt, int yTilt, qreal tpressure,
@@ -372,6 +373,7 @@ public:
qreal rotation;
int z;
qint64 uid;
+ static bool platformSynthesizesMouse;
};
class TabletEnterProximityEvent : public InputEvent {