blob: 4075c95f98422b1313bb0f12a6b963f17acfafa5 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QVIRTUALKEYBOARDINPUTCONTEXT_P_H
#define QVIRTUALKEYBOARDINPUTCONTEXT_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QObject>
#include <QRectF>
#include <QInputMethodEvent>
#include <QtVirtualKeyboard/qvirtualkeyboardinputcontext.h>
#include <QtVirtualKeyboard/private/shadowinputcontext_p.h>
QT_BEGIN_NAMESPACE
namespace QtVirtualKeyboard {
// Boolean variable QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS will enable virtual keyboard
// to send key events without having any text input in focus when an environment
// variable QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS is set. This will also enable virtual
// keyboard shift key usage in the same no focus situation.
extern const bool QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS;
class PlatformInputContext;
class ShiftHandler;
}
class QVirtualKeyboardInputEngine;
class QVirtualKeyboardInputContextPrivate;
class QVIRTUALKEYBOARD_EXPORT QVirtualKeyboardInputContextPrivate : public QObject
{
Q_OBJECT
Q_DECLARE_PUBLIC(QVirtualKeyboardInputContext)
Q_PROPERTY(bool focus READ focus WRITE setFocus NOTIFY focusChanged)
Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle WRITE setKeyboardRectangle NOTIFY keyboardRectangleChanged)
Q_PROPERTY(QRectF previewRectangle READ previewRectangle WRITE setPreviewRectangle NOTIFY previewRectangleChanged)
Q_PROPERTY(bool previewVisible READ previewVisible WRITE setPreviewVisible NOTIFY previewVisibleChanged)
Q_PROPERTY(QString locale READ locale WRITE setLocale NOTIFY localeChanged)
Q_PROPERTY(QObject *inputItem READ inputItem NOTIFY inputItemChanged)
Q_PROPERTY(QtVirtualKeyboard::ShiftHandler *shiftHandler READ shiftHandler CONSTANT)
Q_PROPERTY(QtVirtualKeyboard::ShadowInputContext *shadow READ shadow CONSTANT)
Q_PROPERTY(QStringList inputMethods READ inputMethods CONSTANT)
explicit QVirtualKeyboardInputContextPrivate(QVirtualKeyboardInputContext *q_ptr);
void init();
public:
enum class State {
Reselect = 0x1,
InputMethodEvent = 0x2,
KeyEvent = 0x4,
InputMethodClick = 0x8,
SyncShadowInput = 0x10
};
Q_FLAG(State)
Q_DECLARE_FLAGS(StateFlags, QVirtualKeyboardInputContextPrivate::State)
~QVirtualKeyboardInputContextPrivate();
bool focus() const;
void setFocus(bool focus);
QRectF keyboardRectangle() const;
void setKeyboardRectangle(QRectF rectangle);
QRectF previewRectangle() const;
void setPreviewRectangle(QRectF rectangle);
bool previewVisible() const;
void setPreviewVisible(bool visible);
QString locale() const;
void setLocale(const QString &locale);
QObject *inputItem() const;
QtVirtualKeyboard::ShiftHandler *shiftHandler() const;
QtVirtualKeyboard::ShadowInputContext *shadow() const;
QStringList inputMethods() const;
// Helper functions
Q_INVOKABLE bool fileExists(const QUrl &fileUrl);
Q_INVOKABLE bool hasEnterKeyAction(QObject *item) const;
Q_SIGNALS:
void focusChanged();
void keyboardRectangleChanged();
void previewRectangleChanged();
void previewVisibleChanged();
void localeChanged();
void inputItemChanged();
void navigationKeyPressed(int key, bool isAutoRepeat);
void navigationKeyReleased(int key, bool isAutoRepeat);
public Q_SLOTS:
void hideInputPanel();
void updateAvailableLocales(const QStringList &availableLocales);
void forceCursorPosition(int anchorPosition, int cursorPosition);
private Q_SLOTS:
void onInputItemChanged();
private:
void sendPreedit(const QString &text, const QList<QInputMethodEvent::Attribute> &attributes, int replaceFrom, int replaceLength);
void sendInputMethodEvent(QInputMethodEvent *event);
void reset();
void commit();
void update(Qt::InputMethodQueries queries);
void invokeAction(QInputMethod::Action action, int cursorPosition);
bool filterEvent(const QEvent *event);
void addSelectionAttribute(QList<QInputMethodEvent::Attribute> &attributes);
bool testAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const;
int findAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const;
inline void setState(const State &state) { stateFlags.setFlag(state); }
inline void clearState(const State &state) { stateFlags &= ~StateFlags(state); }
inline bool testState(const State &state) const { return stateFlags.testFlag(state); }
inline bool isEmptyState() const { return !stateFlags; }
private:
QVirtualKeyboardInputContext *q_ptr;
QtVirtualKeyboard::PlatformInputContext *platformInputContext;
QVirtualKeyboardInputEngine *inputEngine;
QtVirtualKeyboard::ShiftHandler *_shiftHandler;
QRectF keyboardRect;
QRectF previewRect;
bool _previewVisible;
bool animating;
bool _focus;
StateFlags stateFlags;
int cursorPosition;
int anchorPosition;
int forceAnchorPosition;
int _forceCursorPosition;
Qt::InputMethodHints inputMethodHints;
QString preeditText;
QList<QInputMethodEvent::Attribute> preeditTextAttributes;
QString surroundingText;
QString selectedText;
QRectF anchorRectangle;
QRectF cursorRectangle;
bool selectionControlVisible;
bool anchorRectIntersectsClipRect;
bool cursorRectIntersectsClipRect;
#ifdef QT_VIRTUALKEYBOARD_ARROW_KEY_NAVIGATION
QSet<int> activeNavigationKeys;
#endif
QSet<quint32> activeKeys;
QtVirtualKeyboard::ShadowInputContext _shadow;
friend class QtVirtualKeyboard::PlatformInputContext;
friend class QVirtualKeyboardScopedState;
};
class QVirtualKeyboardScopedState
{
Q_DISABLE_COPY(QVirtualKeyboardScopedState)
public:
QVirtualKeyboardScopedState(QVirtualKeyboardInputContextPrivate *d, QVirtualKeyboardInputContextPrivate::State state) :
d(d),
state(state)
{
d->setState(state);
}
~QVirtualKeyboardScopedState()
{
d->clearState(state);
}
private:
QVirtualKeyboardInputContextPrivate *d;
QVirtualKeyboardInputContextPrivate::State state;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QVirtualKeyboardInputContextPrivate::StateFlags)
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QVirtualKeyboardInputContextPrivate::State)
#endif // QVIRTUALKEYBOARDINPUTCONTEXT_P_H