/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** 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 Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!

\page qtvirtualkeyboard-deployment-guide.html

\title Deployment Guide

\section1 Overview

This document describes how to deploy and use the Qt Virtual Keyboard plugin
with Qt applications.

\section1 Deployment

The various Qt Virtual Keyboard plugins and files are deployed in the following
locations:

\table
\header
    \li Item
    \li Desktop install path
    \li Boot2Qt install path
\row
    \li qtvirtualkeyboardplugin
    \li \c <QT_INSTALL_PLUGINS>/platforminputcontexts
    \li \c /system/plugins/platforminputcontexts
\row
    \li qtvirtualkeyboardextensionplugin
    \li \c <QT_INSTALL_PLUGINS>/virtualkeyboard
    \li \c /system/plugins/virtualkeyboard
\row
    \li qtvirtualkeyboardplugin QML files
    \li \c <QT_INSTALL_QML>/QtQuick/VirtualKeyboard
    \li \c /system/qml/QtQuick/VirtualKeyboard
\row
    \li qtvirtualkeyboardstylesplugin
    \li \c <QT_INSTALL_QML>/QtQuick/VirtualKeyboard/Styles
    \li \c /system/qml/QtQuick/VirtualKeyboard/Styles
\endtable

\section2 Dependencies

The Qt Virtual Keyboard plugin \e (qtvirtualkeyboardplugin) has a dependency
to the \e {libQt\QtMajorVersion}\e{\VirtualKeyboard} library. In addition, the
plugin depends on Qt Quick. Therefore, a stand-alone application based on
\l [QtWidgets] {Qt Widgets} must deploy also the
\e {libQt\QtMajorVersion}\e{Quick} library and its dependencies in order to
use the virtual keyboard.

Read more at \l {Deploying Qt's Libraries}.

\section1 Integration Method

Qt Virtual Keyboard currently supports two alternative integration methods
for using the plugin:

\list
    \li \c Desktop: requires no changes to existing applications. The virtual
        keyboard is available to all Qt applications in the system.

        In this integration method, the keyboard is shown in a dedicated
        top-level window.
    \li \c Application: the virtual keyboard is embedded within the Qt
        application itself by instantiating an \l InputPanel item in QML.

        This method is mandatory in environments where there is no support
        for multiple top-level windows (such as embedded devices), but can
        be used in desktop applications too.

        This method can also be used by Qt Wayland compositors in order to
        provide a server-side virtual keyboard. See the section below for details.
\endlist

The integration method is automatically selected by the project files.
However, in desktop environments, it is possible to override the desktop
integration method and use the application integration method instead,
by using the \c QT_VIRTUALKEYBOARD_DESKTOP_DISABLE environment variable,
or by adding \c CONFIG+=disable-desktop to the \c qmake command line.

\section2 Using Qt Virtual Keyboard with Qt Wayland

This section explains how to use Qt Virtual Keyboard to interact with the
\l {Line Edits Example}{Qt Widgets Line Edits example} using the
\l {Qt Wayland Compositor Examples - Pure QML}{Pure QML example}
as a compositor.

We will be using Ubuntu 18.04 to run the example, using the X11 as the
windowing system. The example compositor (\c pure-qml) will open
as a window within an X11 session.

\list 1
    \li Start the compositor:
        \badcode
QT_XCB_GL_INTEGRATION=xcb_egl QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=xcomposite-egl QT_IM_MODULE=qtvirtualkeyboard ./pure-qml -platform xcb
        \endcode
    \li Before running the client application, ensure that QT_IM_MODULE is unset:
        \badcode
unset QT_IM_MODULE
        \endcode
    \li Start the Line Edits example as the client:
        \badcode
./lineedits -platform wayland
        \endcode
    \li Click on a line edit and Qt Virtual Keyboard's input panel will open.
\endlist

If issues are encountered, the following environment variables can be set
when running the compositor to get debug output that can help diagnose the issue:

\badcode
WAYLAND_DEBUG=1
QT_LOGGING_RULES="qt.virtualkeyboard=true;qt.qpa.wayland*=true"
\endcode

\section1 Loading the Plugin

In both integration methods, the application must use the \c QT_IM_MODULE
environment variable to load the plugin. For example:

\code
$ QT_IM_MODULE=qtvirtualkeyboard myapp
\endcode

or in the main() function:

\code
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
\endcode

In the desktop integration method, this step is all that is required to
use Qt Virtual Keyboard. In the application integration method, the application
is required to create an instance of InputPanel as explained in the
following chapter.

\section1 Creating InputPanel

The following example shows how to create an InputPanel and how to
divide the screen area with the application container.

\code
import QtQuick 2.0
import QtQuick.VirtualKeyboard 2.1

Item {
    id: root
    Item {
        id: appContainer
        anchors.left: parent.left
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.bottom: inputPanel.top
        ...
    }
    InputPanel {
        id: inputPanel
        y: Qt.inputMethod.visible ? parent.height - inputPanel.height : parent.height
        anchors.left: parent.left
        anchors.right: parent.right
    }
}
\endcode

The input panel must be a sibling element next to the application container.
It is important not to put the input panel within the application container,
as it would then overlap with the contents of the application. Also, the
input panel height will be automatically updated according to the available
width; the aspect ratio of the input panel is constant.

\section1 Environment Variables

There are several environment variables defined by the module that are listed below:

\table
    \header
        \li Variable
        \li Purpose
    \row
        \li QT_VIRTUALKEYBOARD_HUNSPELL_DATA_PATH
        \li Overrides the location of the Hunspell data files.

            The default location depends on the value of
            \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/hunspell}.

            See \l {Hunspell Integration} for more information.
    \row
        \li QT_VIRTUALKEYBOARD_PINYIN_DICTIONARY
        \li Overrides the location of the Pinyin dictionary.

            By default, the dictionary is bundled into the plugin's resources.

            To disable resource bundling, add \c CONFIG+=no-bundle-pinyin in the
            plugin's qmake command line. In this scenario, the default location
            depends on the value of \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/pinyin/dict_pinyin.dat}.
    \row
        \li QT_VIRTUALKEYBOARD_CANGJIE_DICTIONARY
        \li Overrides the location of the Cangjie dictionary.

            By default, the dictionary is bundled into the plugin's resources.

            To disable resource bundling, add \c CONFIG+=no-bundle-tcime in the
            plugin's qmake command line. In this scenario, the default location
            depends on the value of \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/tcime/dict_cangjie.dat}.
    \row
        \li QT_VIRTUALKEYBOARD_ZHUYIN_DICTIONARY
        \li Overrides the location of the Zhuyin dictionary.

            By default, the dictionary is bundled into the plugin's resources.

            To disable resource bundling, add \c CONFIG+=no-bundle-tcime in the
            plugin's qmake command line. In this scenario, the default location
            depends on the value of \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/tcime/dict_zhuyin.dat}.
    \row
        \li QT_VIRTUALKEYBOARD_PHRASE_DICTIONARY
        \li Overrides the location of the phrase dictionary.

            By default, the dictionary is bundled into the plugin's resources.

            To disable resource bundling, add \c CONFIG+=no-bundle-tcime in the
            plugin's qmake command line. In this scenario, the default location
            depends on the value of \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/tcime/dict_phrases.dat}.
    \row
        \li QT_VIRTUALKEYBOARD_STYLE
        \li Specifies the location of the style to use with the virtual keyboard.

            This can also be specified in QML by setting \l {VirtualKeyboardSettings::styleName},
            or at build time by using the \l {Advanced Configuration Options}{qmake configuration options}.
    \row
        \li QT_VIRTUALKEYBOARD_LAYOUT_PATH
        \li Specifies the location of the layouts to be used with the virtual keyboard.
    \row
        \li QT_VIRTUALKEYBOARD_DESKTOP_DISABLE
        \li Disables the desktop integration method.
    \row
        \li LIPI_ROOT
        \li Specifies the location of lipi-toolkit.

            The default location depends on the value of
            \c {QLibraryInfo::location(QLibraryInfo::DataPath)}.
            For example, for Qt libraries built from source,
            it could be \c {qtbase/qtvirtualkeyboard/lipi_toolkit}.
    \row
        \li LIPI_LIB
        \li Specifies the location of lipi-toolkit plugins.

            The default location depends on \c LIPI_ROOT:
            \list
            \li \c {LIPI_ROOT + "/lib"} if \c LIPI_ROOT is set.
            \li \c {QLibraryInfo::location(QLibraryInfo::PluginsPath) + "/lipi_toolkit"} if \c LIPI_ROOT is not set.
            \endlist
    \row
        \li QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS
        \li Enables Qt Virtual Keyboard to send key events and use Shift key without having any text input in focus.

            This variable needs to be explicitly set in the run environment of an application that wants to benefit
            from this. Using qputenv() in the application itself is not sufficient.
\endtable

*/
