QtBase  v6.3.1
qinputmethod.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include <qinputmethod.h>
41 #include <private/qinputmethod_p.h>
42 #include <qguiapplication.h>
43 #include <qtimer.h>
44 #include <qpa/qplatforminputcontext_p.h>
45 
46 #include <QDebug>
47 
49 
53 QInputMethod::QInputMethod()
55 {
56 }
57 
61 QInputMethod::~QInputMethod()
62 {
63 }
64 
82 {
83  Q_D(const QInputMethod);
84  return d->inputItemTransform;
85 }
86 
93 {
94  Q_D(QInputMethod);
95  if (d->inputItemTransform == transform)
96  return;
97 
98  d->inputItemTransform = transform;
101 }
102 
103 
112 {
113  Q_D(const QInputMethod);
114  return d->inputRectangle;
115 }
116 
125 {
126  Q_D(QInputMethod);
127  d->inputRectangle = rect;
128 }
129 
130 static QRectF inputMethodQueryRectangle_helper(Qt::InputMethodQuery imquery, const QTransform &xform)
131 {
132  QRectF r;
133  if (QObject *focusObject = qGuiApp->focusObject()) {
134  QInputMethodQueryEvent query(imquery);
135  QGuiApplication::sendEvent(focusObject, &query);
136  r = query.value(imquery).toRectF();
137  if (r.isValid())
138  r = xform.mapRect(r);
139  }
140  return r;
141 }
142 
151 {
152  Q_D(const QInputMethod);
153  return inputMethodQueryRectangle_helper(Qt::ImCursorRectangle, d->inputItemTransform);
154 }
155 
164 {
165  Q_D(const QInputMethod);
166  return inputMethodQueryRectangle_helper(Qt::ImAnchorRectangle, d->inputItemTransform);
167 }
168 
177 {
178  Q_D(const QInputMethod);
179  QPlatformInputContext *ic = d->platformInputContext();
180  if (ic)
181  return ic->keyboardRect();
182  return QRectF();
183 }
184 
193 {
194  Q_D(const QInputMethod);
195  return inputMethodQueryRectangle_helper(Qt::ImInputItemClipRectangle, d->inputItemTransform);
196 }
207 {
208  Q_D(QInputMethod);
209  QPlatformInputContext *ic = d->platformInputContext();
210  if (ic)
211  ic->showInputPanel();
212 }
213 
222 {
223  Q_D(QInputMethod);
224  QPlatformInputContext *ic = d->platformInputContext();
225  if (ic)
226  ic->hideInputPanel();
227 }
228 
239 {
240  Q_D(const QInputMethod);
241  QPlatformInputContext *ic = d->platformInputContext();
242  if (ic)
243  return ic->isInputPanelVisible();
244  return false;
245 }
246 
254 void QInputMethod::setVisible(bool visible)
255 {
256  visible ? show() : hide();
257 }
258 
270 {
271  Q_D(const QInputMethod);
272  QPlatformInputContext *ic = d->platformInputContext();
273  if (ic)
274  return ic->isAnimating();
275  return false;
276 }
277 
283 {
284  Q_D(const QInputMethod);
285  QPlatformInputContext *ic = d->platformInputContext();
286  if (ic)
287  return ic->locale();
288  return QLocale::c();
289 }
290 
296 {
297  Q_D(const QInputMethod);
298  QPlatformInputContext *ic = d->platformInputContext();
299  if (ic)
300  return ic->inputDirection();
301  return Qt::LeftToRight;
302 }
303 
315 void QInputMethod::update(Qt::InputMethodQueries queries)
316 {
317  Q_D(QInputMethod);
318 
319  if (queries & Qt::ImEnabled) {
320  QObject *focus = qApp->focusObject();
321  bool enabled = d->objectAcceptsInputMethod(focus);
323  }
324 
325  QPlatformInputContext *ic = d->platformInputContext();
326  if (ic)
327  ic->update(queries);
328 
329  if (queries & Qt::ImCursorRectangle)
331 
332  if (queries & (Qt::ImAnchorRectangle))
334 
335  if (queries & (Qt::ImInputItemClipRectangle))
337 }
338 
346 {
347  Q_D(QInputMethod);
348  QPlatformInputContext *ic = d->platformInputContext();
349  if (ic)
350  ic->reset();
351 }
352 
362 {
363  Q_D(QInputMethod);
364  QPlatformInputContext *ic = d->platformInputContext();
365  if (ic)
366  ic->commit();
367 }
368 
385 void QInputMethod::invokeAction(Action a, int cursorPosition)
386 {
387  Q_D(QInputMethod);
388  QPlatformInputContext *ic = d->platformInputContext();
389  if (ic)
390  ic->invokeAction(a, cursorPosition);
391 }
392 
393 static inline bool platformSupportsHiddenText()
394 {
396  return inputContext && inputContext->hasCapability(QPlatformInputContext::HiddenTextCapability);
397 }
398 
400 {
401  bool enabled = false;
402  if (object) {
403  // If the platform does not support hidden text, query the hints
404  // in addition and disable in case of ImhHiddenText.
405  static const bool supportsHiddenText = platformSupportsHiddenText();
406  QInputMethodQueryEvent query(supportsHiddenText
407  ? Qt::InputMethodQueries(Qt::ImEnabled)
408  : Qt::InputMethodQueries(Qt::ImEnabled | Qt::ImHints));
410  enabled = query.value(Qt::ImEnabled).toBool();
411  if (enabled && !supportsHiddenText
412  && Qt::InputMethodHints(query.value(Qt::ImHints).toInt()).testFlag(Qt::ImhHiddenText)) {
413  enabled = false;
414  }
415  }
416  return enabled;
417 }
418 
423 {
424  QVariant retval;
425  QObject *focusObject = qGuiApp->focusObject();
426  if (!focusObject)
427  return retval;
428 
429  static const char *signature = "inputMethodQuery(Qt::InputMethodQuery,QVariant)";
430  const bool newMethodSupported = focusObject->metaObject()->indexOfMethod(signature) != -1;
431  if (newMethodSupported) {
432  const bool ok = QMetaObject::invokeMethod(focusObject, "inputMethodQuery",
434  Q_RETURN_ARG(QVariant, retval),
437  Q_ASSERT(ok);
438  return retval;
439  }
440 
441  QInputMethodQueryEvent queryEvent(query);
442  QCoreApplication::sendEvent(focusObject, &queryEvent);
443  return queryEvent.value(query);
444 }
445 
447 
448 #include "moc_qinputmethod.cpp"
static bool sendEvent(QObject *receiver, QEvent *event)
static QPlatformIntegration * platformIntegration()
The QInputMethod class provides access to the active text input method. \inmodule QtGui.
Definition: qinputmethod.h:55
QRectF cursorRectangle
Input item's cursor rectangle in window coordinates.
Definition: qinputmethod.h:58
void setInputItemTransform(const QTransform &transform)
Qt::LayoutDirection inputDirection
Current input direction.
Definition: qinputmethod.h:66
void update(Qt::InputMethodQueries queries)
bool visible
Virtual keyboard's visibility on the screen.
Definition: qinputmethod.h:63
void anchorRectangleChanged()
QRectF keyboardRectangle
Virtual keyboard's geometry in window coordinates.
Definition: qinputmethod.h:60
QRectF anchorRectangle
Input item's anchor rectangle in window coordinates.
Definition: qinputmethod.h:59
static QVariant queryFocusObject(Qt::InputMethodQuery query, const QVariant &argument)
QRectF inputItemRectangle() const
void inputItemClipRectangleChanged()
QTransform inputItemTransform() const
QLocale locale
Current input locale.
Definition: qinputmethod.h:65
void invokeAction(Action a, int cursorPosition)
void cursorRectangleChanged()
bool isVisible() const
QRectF inputItemClipRectangle
Input item's clipped rectangle in window coordinates.
Definition: qinputmethod.h:62
void setVisible(bool visible)
void setInputItemRectangle(const QRectF &rect)
bool isAnimating() const
static bool objectAcceptsInputMethod(QObject *object)
The QInputMethodQueryEvent class provides an event sent by the input context to input objects.
Definition: qevent.h:753
QVariant value(Qt::InputMethodQuery query) const
Definition: qevent.cpp:2462
static QLocale c()
Definition: qlocale.h:1134
The QObject class is the base class of all Qt objects.
Definition: qobject.h:125
virtual bool isInputPanelVisible() const
virtual bool isAnimating() const
virtual QLocale locale() const
virtual bool hasCapability(Capability capability) const
virtual void update(Qt::InputMethodQueries)
virtual void invokeAction(QInputMethod::Action, int cursorPosition)
virtual Qt::LayoutDirection inputDirection() const
virtual QRectF keyboardRect() const
static void setInputMethodAccepted(bool accepted)
virtual QPlatformInputContext * inputContext() const
The QRectF class defines a finite rectangle in the plane using floating point precision.
Definition: qrect.h:511
The QTransform class specifies 2D transformations of a coordinate system.
Definition: qtransform.h:56
QRect mapRect(const QRect &) const
The QVariant class acts like a union for the most common Qt data types.
Definition: qvariant.h:95
bool focus
[0]
rect
[4]
InputMethodQuery
Definition: qnamespace.h:1380
@ ImAnchorRectangle
Definition: qnamespace.h:1396
@ ImInputItemClipRectangle
Definition: qnamespace.h:1397
@ ImCursorRectangle
Definition: qnamespace.h:1382
@ ImHints
Definition: qnamespace.h:1389
@ ImEnabled
Definition: qnamespace.h:1381
LayoutDirection
Definition: qnamespace.h:1462
@ LeftToRight
Definition: qnamespace.h:1463
@ ImhHiddenText
Definition: qnamespace.h:1411
@ DirectConnection
Definition: qnamespace.h:1306
#define qApp
#define qGuiApp
#define Q_ARG(type, data)
Definition: qobjectdefs.h:98
#define Q_RETURN_ARG(type, data)
Definition: qobjectdefs.h:99
GLboolean r
[2]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLuint GLenum GLenum transform
Definition: qopenglext.h:11564
GLenum query
Definition: qopenglext.h:2738
#define Q_ASSERT(cond)
Definition: qrandom.cpp:84
#define emit
Definition: qtmetamacros.h:85
#define enabled
Definition: qopenglext.h:3098
QTransform xform
[18]
QDBusArgument argument
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
const char * signature