MicroFocus is in item coordinates
authorLars Knoll <lars.knoll@nokia.com>
Wed, 7 Sep 2011 19:26:36 +0000 (21:26 +0200)
committerLars Knoll <lars.knoll@nokia.com>
Thu, 8 Sep 2011 08:32:25 +0000 (10:32 +0200)
Always set the microFocus/cursorRectangle in item
coordinates.
Correctly update the itemTransform in the QInputPanel for QWidgets.

Change-Id: Ic0187f808996f31e6238d934f43bc97a70522a55
Reviewed-on: http://codereview.qt-project.org/4402
Reviewed-by: Vesa Rantanen <vesa.rantanen@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/gui/kernel/qinputpanel.cpp
src/gui/text/qlinecontrol.cpp
src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp
src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h
src/widgets/kernel/qwidget.cpp
src/widgets/kernel/qwidget_p.h

index 5219ade..e58202f 100644 (file)
@@ -91,13 +91,17 @@ void QInputPanel::setInputItemTranform(const QTransform &transform)
 
 QRectF QInputPanel::cursorRectangle() const
 {
+    Q_D(const QInputPanel);
+
+    if (!d->inputItem)
+        return QRectF();
+
     QInputMethodQueryEvent query(Qt::ImMicroFocus);
-    QGuiApplication::sendEvent(inputItem(), &query);
+    QGuiApplication::sendEvent(d->inputItem.data(), &query);
     QRect r = query.value().toRect();
     if (!r.isValid())
         return QRect();
 
-    Q_D(const QInputPanel);
     return d->inputItemTransform.mapRect(r);
 }
 
@@ -147,6 +151,11 @@ bool QInputPanel::isAnimating() const
 
 void QInputPanel::update(Qt::InputMethodQueries queries)
 {
+    Q_D(QInputPanel);
+
+    if (!d->inputItem)
+        return;
+
     QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
     if (ic)
         ic->update(queries);
index 6f9d940..eb6f22b 100644 (file)
 #ifndef QT_NO_ACCESSIBILITY
 #include "qaccessible.h"
 #endif
-#ifndef QT_NO_IM
-#include "qinputcontext.h"
-#include "qlist.h"
-#endif
 #include "qguiapplication.h"
 #include "qstylehints.h"
 
index fba9116..af8fd5a 100644 (file)
@@ -43,6 +43,7 @@
 #include <QtDebug>
 #include <QTextCharFormat>
 #include <QGuiApplication>
+#include <qwindow.h>
 #include <qevent.h>
 
 #include "qibusproxy.h"
@@ -86,6 +87,7 @@ QIBusPlatformInputContext::QIBusPlatformInputContext ()
     }
     QInputPanel *p = qApp->inputPanel();
     connect(p, SIGNAL(inputItemChanged()), this, SLOT(inputItemChanged()));
+    connect(p, SIGNAL(cursorRectangleChanged()), this, SLOT(cursorRectChanged()));
 }
 
 QIBusPlatformInputContext::~QIBusPlatformInputContext (void)
@@ -119,22 +121,22 @@ void QIBusPlatformInputContext::reset()
 void QIBusPlatformInputContext::update(Qt::InputMethodQueries q)
 {
     QPlatformInputContext::update(q);
+}
 
+void QIBusPlatformInputContext::cursorRectChanged()
+{
     if (!d->valid)
         return;
 
-    QObject *o = qApp->inputPanel()->inputItem();
-    if (!o)
+    QRect r = qApp->inputPanel()->cursorRectangle().toRect();
+    if(!r.isValid())
         return;
 
-    QInputMethodQueryEvent query(Qt::ImMicroFocus);
-    QGuiApplication::sendEvent(o, &query);
-    QRect r = query.value().toRect();
-    if(r.isValid()) {
-        if (debug)
-            qDebug() << "microFocus" << r;
-        d->context->SetCursorLocation(r.x(), r.y(), r.width(), r.height());
-    }
+    QWindow *inputWindow = qApp->inputPanel()->inputWindow();
+    r.moveTopLeft(inputWindow->mapToGlobal(r.topLeft()));
+    if (debug)
+        qDebug() << "microFocus" << r;
+    d->context->SetCursorLocation(r.x(), r.y(), r.width(), r.height());
 }
 
 void QIBusPlatformInputContext::inputItemChanged()
index 66c3aee..8583118 100644 (file)
@@ -65,6 +65,7 @@ public Q_SLOTS:
     void commitText(const QDBusVariant &text);
     void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible);
     void inputItemChanged();
+    void cursorRectChanged();
 
 private:
     QIBusPlatformInputContextPrivate *d;
index c1526d4..494152d 100644 (file)
 #include "qinputcontext.h"
 #include "qfileinfo.h"
 #include "private/qsoftkeymanager_p.h"
-
-#if defined (Q_WS_WIN)
-# include <private/qwininputcontext_p.h>
-#endif
-
-#if defined(Q_WS_X11)
-# include <private/qpaintengine_x11_p.h>
-# include "qx11info_x11.h"
-#endif
+#include <QtGui/qinputpanel.h>
 
 #include <private/qgraphicseffect_p.h>
 #include <qbackingstore.h>
@@ -369,6 +361,17 @@ void QWidgetPrivate::scrollChildren(int dx, int dy)
     }
 }
 
+void QWidgetPrivate::updateWidgetTransform()
+{
+    Q_Q(QWidget);
+    if (q == qApp->inputPanel()->inputItem()) {
+        QTransform t;
+        QPoint p = q->mapTo(q->topLevelWidget(), QPoint(0,0));
+        t.translate(p.x(), p.y());
+        qApp->inputPanel()->setInputItemTranform(t);
+    }
+}
+
 QInputContext *QWidgetPrivate::assignedInputContext() const
 {
 #ifndef QT_NO_IM
@@ -8357,11 +8360,6 @@ bool QWidget::event(QEvent *event)
             QInputMethodQueryEvent *query = static_cast<QInputMethodQueryEvent *>(event);
             QVariant v = inputMethodQuery(query->query());
 
-            if (query->query() == Qt::ImMicroFocus) {
-                QRect r = v.toRect();
-                v = QRect(mapToGlobal(r.topLeft()), r.size());
-            }
-
             query->setValue(v);
             query->accept();
             break;
@@ -8396,6 +8394,7 @@ bool QWidget::event(QEvent *event)
         QSoftKeyManager::updateSoftKeys();
 #endif
         focusInEvent((QFocusEvent*)event);
+        d->updateWidgetTransform();
         break;
 
     case QEvent::FocusOut:
@@ -8437,10 +8436,12 @@ bool QWidget::event(QEvent *event)
 
     case QEvent::Move:
         moveEvent((QMoveEvent*)event);
+        d->updateWidgetTransform();
         break;
 
     case QEvent::Resize:
         resizeEvent((QResizeEvent*)event);
+        d->updateWidgetTransform();
         break;
 
     case QEvent::Close:
index f3838ee..7c74f79 100644 (file)
@@ -504,6 +504,9 @@ public:
     void syncBackingStore();
     void syncBackingStore(const QRegion &region);
 
+    // tells the input panel about the widgets transform
+    void updateWidgetTransform();
+
     void reparentFocusWidgets(QWidget *oldtlw);
 
     static int pointToRect(const QPoint &p, const QRect &r);