From e941b37fcc715fc20d7365cae21cd657a215cf8f Mon Sep 17 00:00:00 2001 From: Joona Petrell Date: Tue, 11 Oct 2011 13:10:50 +0300 Subject: Move input panel visibility ownership from QInputPanel to QPlatformInputContext Now QInputPanel::visible() can be set true even when platform doesn't provide a virtual keyboard. Like keyboard geometry, visibility should be dictated by the platform plugin and not QInputPanel, whose role is more like that of a mediator. QInputPanel::show() and ::hide() calls should be treated as requests that may fail. Changed the QInputPanel's visible property to read-only as a setter that may fail is not really a setter, show() and hide() should be used instead. Enabling the new functionality cannot be activated immediatelly without breaking existing keyboards, added a temporary function handlesInputPanelVisibility that handovers the responsiblity of updating input panel visibility to QInputContextPlatform only once QInputContextPlatform says that it is able to handle it. Change-Id: Ideecaf7225cc3971f33a0ac976bd92cf7767475b Reviewed-on: http://codereview.qt-project.org/6429 Sanity-Review: Qt Sanity Bot Reviewed-by: Pekka Vuorela Reviewed-by: Lars Knoll --- src/gui/kernel/qinputpanel.cpp | 34 +++++++++++++++------- src/gui/kernel/qinputpanel.h | 2 +- src/gui/kernel/qplatforminputcontext_qpa.cpp | 27 +++++++++++++++-- src/gui/kernel/qplatforminputcontext_qpa.h | 12 ++++++-- .../ibus/qibusplatforminputcontext.cpp | 5 ++++ .../ibus/qibusplatforminputcontext.h | 2 ++ 6 files changed, 66 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qinputpanel.cpp b/src/gui/kernel/qinputpanel.cpp index a024a823f3..a7978c6aff 100644 --- a/src/gui/kernel/qinputpanel.cpp +++ b/src/gui/kernel/qinputpanel.cpp @@ -118,29 +118,42 @@ QRectF QInputPanel::keyboardRectangle() void QInputPanel::show() { - setVisible(true); + Q_D(QInputPanel); + QPlatformInputContext *ic = d->platformInputContext(); + if (ic && ic->handlesInputPanelVisibility()) + ic->showInputPanel(); + else if (!d->visible) { + d->visible = true; + emit visibleChanged(); + } } void QInputPanel::hide() { - setVisible(false); + Q_D(QInputPanel); + QPlatformInputContext *ic = d->platformInputContext(); + if (ic && ic->handlesInputPanelVisibility()) + ic->hideInputPanel(); + else if (d->visible) { + d->visible = false; + emit visibleChanged(); + } } bool QInputPanel::visible() const { Q_D(const QInputPanel); - - return d->visible; + QPlatformInputContext *ic = d->platformInputContext(); + if (ic && ic->handlesInputPanelVisibility()) + return ic->isInputPanelVisible(); + else + return d->visible; + return false; } void QInputPanel::setVisible(bool visible) { - Q_D(QInputPanel); - if (d->visible == visible) - return; - - d->visible = visible; - emit visibleChanged(); + visible ? show() : hide(); } bool QInputPanel::isAnimating() const @@ -152,7 +165,6 @@ bool QInputPanel::isAnimating() const return false; } - void QInputPanel::update(Qt::InputMethodQueries queries) { Q_D(QInputPanel); diff --git a/src/gui/kernel/qinputpanel.h b/src/gui/kernel/qinputpanel.h index 292b01a8cf..4edc902104 100644 --- a/src/gui/kernel/qinputpanel.h +++ b/src/gui/kernel/qinputpanel.h @@ -62,7 +62,7 @@ class Q_GUI_EXPORT QInputPanel : public QObject Q_PROPERTY(QObject *inputItem READ inputItem WRITE setInputItem NOTIFY inputItemChanged) Q_PROPERTY(QRectF cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged) Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle NOTIFY keyboardRectangleChanged) - Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) + Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged) Q_PROPERTY(bool animating READ isAnimating NOTIFY animatingChanged) Q_ENUMS(Action) diff --git a/src/gui/kernel/qplatforminputcontext_qpa.cpp b/src/gui/kernel/qplatforminputcontext_qpa.cpp index 0313f69e5b..55b60279b8 100644 --- a/src/gui/kernel/qplatforminputcontext_qpa.cpp +++ b/src/gui/kernel/qplatforminputcontext_qpa.cpp @@ -90,12 +90,12 @@ QRectF QPlatformInputContext::keyboardRect() const return QRectF(); } -void QPlatformInputContext::emitKeyboardRectChanged() const +void QPlatformInputContext::emitKeyboardRectChanged() { emit qApp->inputPanel()->keyboardRectangleChanged(); } -bool QPlatformInputContext::isAnimating() +bool QPlatformInputContext::isAnimating() const { return false; } @@ -105,5 +105,28 @@ void QPlatformInputContext::emitAnimatingChanged() emit qApp->inputPanel()->animatingChanged(); } +void QPlatformInputContext::showInputPanel() +{ +} + +void QPlatformInputContext::hideInputPanel() +{ +} + +bool QPlatformInputContext::isInputPanelVisible() const +{ + return false; +} + +void QPlatformInputContext::emitInputPanelVisibleChanged() +{ + emit qApp->inputPanel()->visibleChanged(); +} + +// temporary function added to retain compatibility to old functionality, will be deprecated +bool QPlatformInputContext::handlesInputPanelVisibility() const +{ + return false; +} QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatforminputcontext_qpa.h b/src/gui/kernel/qplatforminputcontext_qpa.h index 8321c0a29c..ab5b6726be 100644 --- a/src/gui/kernel/qplatforminputcontext_qpa.h +++ b/src/gui/kernel/qplatforminputcontext_qpa.h @@ -68,10 +68,18 @@ public: virtual void invokeAction(QInputPanel::Action, int cursorPosition); virtual bool filterEvent(const QEvent *event); virtual QRectF keyboardRect() const; - void emitKeyboardRectChanged() const; + void emitKeyboardRectChanged(); - virtual bool isAnimating(); + virtual bool isAnimating() const; void emitAnimatingChanged(); + + virtual void showInputPanel(); + virtual void hideInputPanel(); + virtual bool isInputPanelVisible() const; + void emitInputPanelVisibleChanged(); + + // temporary function added to retain compatibility to old functionality, will be deprecated + virtual bool handlesInputPanelVisibility() const; }; QT_END_NAMESPACE diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp index 0d0e240b37..67ee9da252 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp @@ -155,6 +155,11 @@ void QIBusPlatformInputContext::inputItemChanged() d->context->FocusOut(); } +// temporary function added to retain compatibility to old functionality, will be deprecated +bool QIBusPlatformInputContext::handlesInputPanelVisibility() const +{ + return true; +} void QIBusPlatformInputContext::commitText(const QDBusVariant &text) { diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h index 6008fc31aa..303b6f7cc0 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h @@ -63,6 +63,8 @@ public: Q_INVOKABLE bool x11FilterEvent(uint keyval, uint keycode, uint state, bool press); + virtual bool handlesInputPanelVisibility() const; + public Q_SLOTS: void commitText(const QDBusVariant &text); void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible); -- cgit v1.2.3