summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorPekka Vuorela <pekka.ta.vuorela@nokia.com>2012-01-20 17:57:21 +0200
committerQt by Nokia <qt-info@nokia.com>2012-01-27 13:27:54 +0100
commitdd565d2d4c7e9b766bc9f575d803ebaad71b33b7 (patch)
treeb81f8b84e26c8b433759e6f97cdcacd0c5419dd0 /src/gui
parente7d0d54084aa04387ebfb8cee292248df5355021 (diff)
QGuiApplication::focusObject() to replace QInputPanel::inputItem()
* Deprecated QInputPanel::inputWindow() which is already just returning QGuiApplication::activeWindow() * Deprecated QInputPanel::inputItem() and introduced QGuiApplication::focusObject(). Input methods can check input method support by Qt::ImEnabled query. Change-Id: I70a9c1c3f79aadb75c839d0489a9428f7a221df5 Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/kernel/qguiapplication.cpp27
-rw-r--r--src/gui/kernel/qguiapplication.h2
-rw-r--r--src/gui/kernel/qinputpanel.cpp33
-rw-r--r--src/gui/kernel/qinputpanel.h9
-rw-r--r--src/gui/kernel/qinputpanel_p.h4
-rw-r--r--src/gui/kernel/qwindow.cpp7
-rw-r--r--src/gui/kernel/qwindow.h2
7 files changed, 79 insertions, 5 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index b3adcfcbaf..0be0927d46 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -196,6 +196,24 @@ QWindow *QGuiApplication::focusWindow()
return QGuiApplicationPrivate::focus_window;
}
+/*!
+ \fn QGuiApplication::focusObjectChanged(QObject *focusObject)
+
+ This signal is emitted when final receiver of events tied to focus is changed.
+ \sa focusObject()
+*/
+
+/*!
+ Returns the QObject in currently active window that will be final receiver of events
+ tied focus, such as key events.
+ */
+QObject *QGuiApplication::focusObject()
+{
+ if (focusWindow())
+ return focusWindow()->focusObject();
+ return 0;
+}
+
QWindowList QGuiApplication::topLevelWindows()
{
return QGuiApplicationPrivate::window_list;
@@ -792,9 +810,13 @@ void QGuiApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate
if (previous == QGuiApplicationPrivate::focus_window)
return;
+ QObject *previousFocusObject = previous ? previous->focusObject() : 0;
+
if (previous) {
QFocusEvent focusOut(QEvent::FocusOut);
QCoreApplication::sendSpontaneousEvent(previous, &focusOut);
+ QObject::disconnect(previous, SIGNAL(focusObjectChanged(QObject*)),
+ qApp, SIGNAL(focusObjectChanged(QObject*)));
} else {
QEvent appActivate(QEvent::ApplicationActivate);
qApp->sendSpontaneousEvent(qApp, &appActivate);
@@ -803,6 +825,8 @@ void QGuiApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate
if (QGuiApplicationPrivate::focus_window) {
QFocusEvent focusIn(QEvent::FocusIn);
QCoreApplication::sendSpontaneousEvent(QGuiApplicationPrivate::focus_window, &focusIn);
+ QObject::connect(QGuiApplicationPrivate::focus_window, SIGNAL(focusObjectChanged(QObject*)),
+ qApp, SIGNAL(focusObjectChanged(QObject*)));
} else {
QEvent appActivate(QEvent::ApplicationDeactivate);
qApp->sendSpontaneousEvent(qApp, &appActivate);
@@ -810,6 +834,9 @@ void QGuiApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate
if (self)
self->notifyActiveWindowChange(previous);
+
+ if (previousFocusObject != qApp->focusObject())
+ emit qApp->focusObjectChanged(qApp->focusObject());
}
void QGuiApplicationPrivate::processWindowStateChangedEvent(QWindowSystemInterfacePrivate::WindowStateChangedEvent *wse)
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index e06df1de58..c858cfe1f0 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -88,6 +88,7 @@ public:
static QT_DEPRECATED QWindow *activeWindow() { return focusWindow(); }
#endif
static QWindow *focusWindow();
+ static QObject *focusObject();
static QScreen *primaryScreen();
static QList<QScreen *> screens();
@@ -133,6 +134,7 @@ Q_SIGNALS:
void fontDatabaseChanged();
void screenAdded(QScreen *screen);
void lastWindowClosed();
+ void focusObjectChanged(QObject *focusObject);
protected:
bool event(QEvent *);
diff --git a/src/gui/kernel/qinputpanel.cpp b/src/gui/kernel/qinputpanel.cpp
index dbc12b04ba..76fc0139c7 100644
--- a/src/gui/kernel/qinputpanel.cpp
+++ b/src/gui/kernel/qinputpanel.cpp
@@ -41,6 +41,8 @@
#include <qinputpanel.h>
#include <private/qinputpanel_p.h>
+#include <qguiapplication.h>
+#include <qtimer.h>
QT_BEGIN_NAMESPACE
@@ -50,6 +52,8 @@ QT_BEGIN_NAMESPACE
QInputPanel::QInputPanel()
: QObject(*new QInputPanelPrivate)
{
+ // might be instantiated before QGuiApplication is fully done, need to connect later
+ QTimer::singleShot(0, this, SLOT(q_connectFocusObject()));
}
/*!
@@ -74,6 +78,7 @@ QInputPanel::~QInputPanel()
/*!
\property QInputPanel::inputItem
\brief Focused item that accepts text input
+ \obsolete
Input item is set and unset by the focused window. In QML Scene Graph this is done by
QQuickCanvas and the input item is either TextInput or TextEdit element. Any QObject can
@@ -101,6 +106,8 @@ void QInputPanel::setInputItem(QObject *inputItem)
/*!
Returns the currently focused window containing the input item.
+
+ \obsolete
*/
QWindow *QInputPanel::inputWindow() const
{
@@ -288,8 +295,8 @@ void QInputPanel::update(Qt::InputMethodQueries queries)
{
Q_D(QInputPanel);
- if (!d->inputItem)
- return;
+ if (queries & Qt::ImEnabled)
+ d->q_checkFocusObject(qApp->focusObject());
QPlatformInputContext *ic = d->platformInputContext();
if (ic)
@@ -342,6 +349,28 @@ void QInputPanel::invokeAction(Action a, int cursorPosition)
ic->invokeAction(a, cursorPosition);
}
+// temporary handlers for updating focus item based on application focus
+void QInputPanelPrivate::q_connectFocusObject()
+{
+ Q_Q(QInputPanel);
+ QObject::connect(qApp, SIGNAL(focusObjectChanged(QObject*)),
+ q, SLOT(q_checkFocusObject(QObject*)));
+ q_checkFocusObject(qApp->focusObject());
+}
+
+void QInputPanelPrivate::q_checkFocusObject(QObject *object)
+{
+ Q_Q(QInputPanel);
+
+ bool enabled = false;
+ if (object) {
+ QInputMethodQueryEvent query(Qt::ImEnabled);
+ QGuiApplication::sendEvent(object, &query);
+ enabled = query.value(Qt::ImEnabled).toBool();
+ }
+ q->setInputItem(enabled ? object : 0);
+}
+
QT_END_NAMESPACE
#include "moc_qinputpanel.cpp"
diff --git a/src/gui/kernel/qinputpanel.h b/src/gui/kernel/qinputpanel.h
index 5cfe75d030..01dfb20eb8 100644
--- a/src/gui/kernel/qinputpanel.h
+++ b/src/gui/kernel/qinputpanel.h
@@ -68,11 +68,11 @@ class Q_GUI_EXPORT QInputPanel : public QObject
Q_ENUMS(Action)
public:
- QObject *inputItem() const;
- void setInputItem(QObject *inputItemChanged);
+ QT_DEPRECATED QObject *inputItem() const;
+ QT_DEPRECATED void setInputItem(QObject *inputItemChanged);
// the window containing the editor
- QWindow *inputWindow() const;
+ QT_DEPRECATED QWindow *inputWindow() const;
QTransform inputItemTransform() const;
void setInputItemTransform(const QTransform &transform);
@@ -121,6 +121,9 @@ private:
friend class QPlatformInputContext;
QInputPanel();
~QInputPanel();
+
+ Q_PRIVATE_SLOT(d_func(), void q_connectFocusObject());
+ Q_PRIVATE_SLOT(d_func(), void q_checkFocusObject(QObject* object));
};
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qinputpanel_p.h b/src/gui/kernel/qinputpanel_p.h
index a61269c141..2528363c96 100644
--- a/src/gui/kernel/qinputpanel_p.h
+++ b/src/gui/kernel/qinputpanel_p.h
@@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE
class QInputPanelPrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QInputPanel)
+
public:
inline QInputPanelPrivate() : testContext(0)
{}
@@ -66,6 +68,8 @@ public:
{
return inputPanel->d_func();
}
+ void q_connectFocusObject();
+ void q_checkFocusObject(QObject *object);
QTransform inputItemTransform;
QWeakPointer<QObject> inputItem;
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index daee1cdd3b..3f9a17e0fe 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -797,6 +797,13 @@ QAccessibleInterface *QWindow::accessibleRoot() const
}
/*!
+ \fn QWindow::focusObjectChanged(QObject *focusObject)
+
+ This signal is emitted when final receiver of events tied to focus is changed.
+ \sa focusObject()
+*/
+
+/*!
Returns the QObject that will be the final receiver of events tied focus, such
as key events.
*/
diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h
index be0ca99b8b..0d886f8cdc 100644
--- a/src/gui/kernel/qwindow.h
+++ b/src/gui/kernel/qwindow.h
@@ -262,6 +262,8 @@ Q_SIGNALS:
void visibleChanged(bool arg);
void contentOrientationChanged(Qt::ScreenOrientation orientation);
+ void focusObjectChanged(QObject *object);
+
private Q_SLOTS:
void screenDestroyed(QObject *screen);