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);
}
void QInputPanel::update(Qt::InputMethodQueries queries)
{
+ Q_D(QInputPanel);
+
+ if (!d->inputItem)
+ return;
+
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
if (ic)
ic->update(queries);
#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"
#include <QtDebug>
#include <QTextCharFormat>
#include <QGuiApplication>
+#include <qwindow.h>
#include <qevent.h>
#include "qibusproxy.h"
}
QInputPanel *p = qApp->inputPanel();
connect(p, SIGNAL(inputItemChanged()), this, SLOT(inputItemChanged()));
+ connect(p, SIGNAL(cursorRectangleChanged()), this, SLOT(cursorRectChanged()));
}
QIBusPlatformInputContext::~QIBusPlatformInputContext (void)
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()
void commitText(const QDBusVariant &text);
void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible);
void inputItemChanged();
+ void cursorRectChanged();
private:
QIBusPlatformInputContextPrivate *d;
#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>
}
}
+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
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;
QSoftKeyManager::updateSoftKeys();
#endif
focusInEvent((QFocusEvent*)event);
+ d->updateWidgetTransform();
break;
case QEvent::FocusOut:
case QEvent::Move:
moveEvent((QMoveEvent*)event);
+ d->updateWidgetTransform();
break;
case QEvent::Resize:
resizeEvent((QResizeEvent*)event);
+ d->updateWidgetTransform();
break;
case QEvent::Close:
void syncBackingStore();
void syncBackingStore(const QRegion ®ion);
+ // tells the input panel about the widgets transform
+ void updateWidgetTransform();
+
void reparentFocusWidgets(QWidget *oldtlw);
static int pointToRect(const QPoint &p, const QRect &r);