From 4469de4ce7a72ab6824629bfe8483131aaf22137 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 7 Jun 2011 15:38:45 +0200 Subject: Cursor support in xcb plug-in. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Custom cursor pixmaps with depth greater than 1 are not yet supported and will be converted to monochrome always. Reviewed-by: Samuel Rødal --- src/gui/kernel/qcursor_qpa.cpp | 23 +++++++++++++++++++++-- src/gui/kernel/qguiapplication.cpp | 4 ++-- src/gui/kernel/qplatformcursor_qpa.cpp | 15 +++++++++++++++ src/gui/kernel/qplatformcursor_qpa.h | 2 ++ 4 files changed, 40 insertions(+), 4 deletions(-) (limited to 'src/gui') diff --git a/src/gui/kernel/qcursor_qpa.cpp b/src/gui/kernel/qcursor_qpa.cpp index c0b27bebd8..a2927601a9 100644 --- a/src/gui/kernel/qcursor_qpa.cpp +++ b/src/gui/kernel/qcursor_qpa.cpp @@ -41,6 +41,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE @@ -107,21 +108,39 @@ void QCursorData::update() #endif //QT_NO_CURSOR -extern int qt_last_x,qt_last_y; +extern int qt_last_x; +extern int qt_last_y; QPoint QCursor::pos() { + QList > cursors = QPlatformCursorPrivate::getInstances(); + int cursorCount = cursors.count(); + for (int i = 0; i < cursorCount; ++i) { + const QWeakPointer &cursor(cursors.at(i)); + if (cursor) + return cursor.data()->pos(); + } return QPoint(qt_last_x, qt_last_y); } void QCursor::setPos(int x, int y) { + QPoint target(x, y); + // Need to check, since some X servers generate null mouse move // events, causing looping in applications which call setPos() on // every mouse move event. // - if (pos() == QPoint(x, y)) + if (pos() == target) return; + + QList > cursors = QPlatformCursorPrivate::getInstances(); + int cursorCount = cursors.count(); + for (int i = 0; i < cursorCount; ++i) { + const QWeakPointer &cursor(cursors.at(i)); + if (cursor) + cursor.data()->setPos(target); + } } QT_END_NAMESPACE diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 80b4aa3206..468e8c3bfd 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -212,7 +212,7 @@ static void init_platform(const QString &name, const QString &platformPluginPath QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath); QString fatalMessage = QString::fromLatin1("Failed to load platform plugin \"%1\". Available platforms are: \n").arg(name); - foreach(QString key, keys) { + foreach(const QString &key, keys) { fatalMessage.append(key + QString::fromLatin1("\n")); } qFatal("%s", fatalMessage.toLocal8Bit().constData()); @@ -221,7 +221,7 @@ static void init_platform(const QString &name, const QString &platformPluginPath } -static void init_plugins(const QList pluginList) +static void init_plugins(const QList &pluginList) { for (int i = 0; i < pluginList.count(); ++i) { QByteArray pluginSpec = pluginList.at(i); diff --git a/src/gui/kernel/qplatformcursor_qpa.cpp b/src/gui/kernel/qplatformcursor_qpa.cpp index b3994103fe..4c98098898 100644 --- a/src/gui/kernel/qplatformcursor_qpa.cpp +++ b/src/gui/kernel/qplatformcursor_qpa.cpp @@ -98,6 +98,21 @@ QPlatformCursor::QPlatformCursor(QPlatformScreen *scr ) QPlatformCursorPrivate::instances.append(this); } +extern int qt_last_x; +extern int qt_last_y; + +QPoint QPlatformCursor::pos() const +{ + // As a fallback return the last mouse position seen by QGuiApplication. + return QPoint(qt_last_x, qt_last_y); +} + +void QPlatformCursor::setPos(const QPoint &pos) +{ + Q_UNUSED(pos); + qWarning("This plugin does not support QCursor::setPos()"); +} + // End of display and pointer event handling code // Beginning of built-in cursor graphics // from src/gui/embedded/QGraphicsSystemCursorImage_qws.cpp diff --git a/src/gui/kernel/qplatformcursor_qpa.h b/src/gui/kernel/qplatformcursor_qpa.h index 89091b555b..af40c7d1c0 100644 --- a/src/gui/kernel/qplatformcursor_qpa.h +++ b/src/gui/kernel/qplatformcursor_qpa.h @@ -86,6 +86,8 @@ public: // input methods virtual void pointerEvent(const QMouseEvent & event) { Q_UNUSED(event); } virtual void changeCursor(QCursor * widgetCursor, QWindow * widget) = 0; + virtual QPoint pos() const; + virtual void setPos(const QPoint &pos); protected: QPlatformScreen* screen; // Where to request an update -- cgit v1.2.3