Add QEvdevKeyMapper platform interface

Task-number: QTBUG-84220
Change-Id: I4f3a54415c5509b4bde486b54c56b0e05976bac6
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
Tor Arne Vestbø 2020-07-17 23:31:41 +02:00
parent 9166abcd99
commit 5b1befa31a
14 changed files with 66 additions and 283 deletions

View File

@ -72,6 +72,9 @@ public:
static void changeKeyboard();
static QList<int> possibleKeys(QKeyEvent *e);
template <typename T>
T *platformInterface() const;
private:
friend QKeyMapperPrivate *qt_keymapper_private();
Q_DECLARE_PRIVATE(QKeyMapper)
@ -96,6 +99,22 @@ public:
QKeyMapperPrivate *qt_keymapper_private(); // from qkeymapper.cpp
// ----------------- QPlatformInterface -----------------
namespace QPlatformInterface::Private {
#if QT_CONFIG(evdev)
struct Q_GUI_EXPORT QEvdevKeyMapper
{
QT_DECLARE_PLATFORM_INTERFACE(QEvdevKeyMapper)
virtual void loadKeymap(const QString &filename) = 0;
virtual void switchLang() = 0;
};
#endif
} // QPlatformInterface::Private
QT_END_NAMESPACE
#endif // QKEYMAPPER_P_H

View File

@ -47,6 +47,8 @@
#include <qpa/qplatformscreen_p.h>
#include <qpa/qplatformwindow_p.h>
#include <QtGui/private/qkeymapper_p.h>
QT_BEGIN_NAMESPACE
using namespace QPlatformInterface::Private;
@ -86,6 +88,16 @@ QT_DEFINE_PRIVATE_PLATFORM_INTERFACE(QXcbScreen);
QT_DEFINE_PRIVATE_PLATFORM_INTERFACE(QXcbWindow);
#endif
#if QT_CONFIG(evdev)
QT_DEFINE_PRIVATE_PLATFORM_INTERFACE(QEvdevKeyMapper);
template <>
QEvdevKeyMapper *QKeyMapper::platformInterface<QEvdevKeyMapper>() const
{
return dynamic_cast<QEvdevKeyMapper*>(QGuiApplicationPrivate::platformIntegration());
}
#endif
#endif // QT_NO_OPENGL
QT_END_NAMESPACE

View File

@ -9,7 +9,6 @@ qt_add_module(PlatformHeaders
SOURCES
eglfsfunctions/qeglfsfunctions_p.h
helper/qplatformheaderhelper_p.h
linuxfbfunctions/qlinuxfbfunctions_p.h
waylandfunctions/qwaylandwindowfunctions_p.h
windowsfunctions/qwindowswindowfunctions_p.h
PUBLIC_LIBRARIES

View File

@ -10,7 +10,6 @@ qt_add_module(PlatformHeaders
# SOURCES
# eglfsfunctions/qeglfsfunctions_p.h
# helper/qplatformheaderhelper_p.h
# linuxfbfunctions/qlinuxfbfunctions_p.h
# waylandfunctions/qwaylandwindowfunctions_p.h
# windowsfunctions/qwindowswindowfunctions_p.h
# special case end

View File

@ -38,49 +38,6 @@
version it was developed against.
*/
/*!
\typedef QEglFSFunctions::LoadKeymapType
Function type for loadKeymap.
*/
/*!
\fn QByteArray QEglFSFunctions::loadKeymapTypeIdentifier()
\return the identifier that can be passed to
QGuiApplication::platformFunction() to query the entry point for the
loadKeymap function implementation.
*/
/*!
\fn void QEglFSFunctions::loadKeymap(const QString &filename)
Loads and switches to the keymap from \a filename. When \a filename is
empty, the default keymap, which is either the built-on one or the keymap
given in the plugin specification, is restored.
\note This is functional only when the evdev keyboard support code is
compiled in to the platform plugin. When using external generic plugins via
the \c{-plugin} argument, or when the environment variable
\c{QT_QPA_EGLFS_DISABLE_INPUT} is set or when building Qt without evdev
support, this function will have no effect.
*/
/*!
\fn void QEglFSFunctions::switchLang()
Switches between English and other language when the keymap is loaded.
Usually the keymap contains two languages: English and national. When
you load the keymap, English is selected by default. This function allows
to switch between these languages.
\note This is functional only when the evdev keyboard support code is
compiled in to the platform plugin. When using external generic plugins via
the \c{-plugin} argument, or when the environment variable
\c{QT_QPA_EGLFS_DISABLE_INPUT} is set or when building Qt without evdev
support, this function will have no effect.
*/
/*!
\fn int QEglFSFunctions::vsp2AddLayer(const QScreen *screen, int dmabufFd, const QSize &size, const QPoint &position, uint drmPixelFormat, uint bytesPerLine)
\internal

View File

@ -59,25 +59,6 @@ QT_BEGIN_NAMESPACE
class QEglFSFunctions
{
public:
typedef void (*LoadKeymapType)(const QString &filename);
typedef void (*SwitchLangType)();
static QByteArray loadKeymapTypeIdentifier() { return QByteArrayLiteral("EglFSLoadKeymap"); }
static QByteArray switchLangTypeIdentifier() { return QByteArrayLiteral("EglFSSwitchLang"); }
static void loadKeymap(const QString &filename)
{
LoadKeymapType func = reinterpret_cast<LoadKeymapType>(QGuiApplication::platformFunction(loadKeymapTypeIdentifier()));
if (func)
func(filename);
}
static void switchLang()
{
SwitchLangType func = reinterpret_cast<SwitchLangType>(QGuiApplication::platformFunction(switchLangTypeIdentifier()));
if (func)
func();
}
typedef int (*Vsp2AddLayerType)(const QScreen *screen, int dmabufFd, const QSize &size, const QPoint &position, uint drmPixelFormat, uint bytesPerLine);
static QByteArray vsp2AddLayerTypeIdentifier() { return QByteArrayLiteral("EglFSVsp2AddLayer"); }

View File

@ -1 +0,0 @@
HEADERS += $$PWD/qlinuxfbfunctions_p.h

View File

@ -1,82 +0,0 @@
/****************************************************************************
**
** 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$
**
****************************************************************************/
/*!
\class QLinuxFbFunctions
\inmodule QtPlatformHeaders
\brief The QLinuxFbFunctions class is an inline class containing
platform-specific functionality for the linuxfb platform plugin that is
typically used on systems running Embedded Linux or Android.
\note There is no binary compatibility guarantee for this class,
meaning that an application using it is only guaranteed to work with the Qt
version it was developed against.
*/
/*!
\typedef QLinuxFbFunctions::LoadKeymapType
Function type for loadKeymap.
*/
/*!
\fn QByteArray QLinuxFbFunctions::loadKeymapTypeIdentifier()
\return the identifier that can be passed to
QGuiApplication::platformFunction() to query the entry point for the
loadKeymap function implementation.
*/
/*!
\fn void QLinuxFbFunctions::loadKeymap(const QString &filename)
Loads and switches to the keymap from \a filename. When \a filename is
empty, the default keymap, which is either the built-on one or the keymap
given in the plugin specification, is restored.
\note This is functional only when the evdev keyboard support code is
compiled in to the platform plugin. When using external generic plugins via
the \c{-plugin} argument, or when the environment variable
\c{QT_QPA_FB_DISABLE_INPUT} is set or when building Qt without evdev
support, this function will have no effect.
*/
/*!
\fn void QLinuxFbFunctions::switchLang()
Switches between English and other language when the keymap is loaded.
Usually the keymap contains two languages: English and national. When
you load the keymap, English is selected by default. This function allows
to switch between these languages.
\note This is functional only when the evdev keyboard support code is
compiled in to the platform plugin. When using external generic plugins via
the \c{-plugin} argument, or when the environment variable
\c{QT_QPA_FB_DISABLE_INPUT} is set or when building Qt without evdev
support, this function will have no effect.
*/

View File

@ -1,85 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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 Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or 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.GPL2 and 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-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QLINUXFBFUNCTIONS_H
#define QLINUXFBFUNCTIONS_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 <QtCore/QByteArray>
#include <QtGui/QGuiApplication>
QT_BEGIN_NAMESPACE
class QLinuxFbFunctions
{
public:
typedef void (*LoadKeymapType)(const QString &filename);
typedef void (*SwitchLangType)();
static QByteArray loadKeymapTypeIdentifier() { return QByteArrayLiteral("LinuxFbLoadKeymap"); }
static QByteArray switchLangTypeIdentifier() { return QByteArrayLiteral("LinuxFbSwitchLang"); }
static void loadKeymap(const QString &filename)
{
LoadKeymapType func = reinterpret_cast<LoadKeymapType>(QGuiApplication::platformFunction(loadKeymapTypeIdentifier()));
if (func)
func(filename);
}
static void switchLang()
{
SwitchLangType func = reinterpret_cast<SwitchLangType>(QGuiApplication::platformFunction(switchLangTypeIdentifier()));
if (func)
func();
}
};
QT_END_NAMESPACE
#endif // QLINUXFBFUNCTIONS_H

View File

@ -5,7 +5,6 @@ include(eglfsfunctions/eglfsfunctions.pri)
include(windowsfunctions/windowsfunctions.pri)
include(helper/helper.pri)
include(waylandfunctions/waylandfunctions.pri)
include(linuxfbfunctions/linuxfbfunctions.pri)
QMAKE_DOCS = $$PWD/doc/qtplatformheaders.qdocconf

View File

@ -432,39 +432,26 @@ QPlatformNativeInterface::NativeResourceForContextFunction QEglFSIntegration::na
QFunctionPointer QEglFSIntegration::platformFunction(const QByteArray &function) const
{
#if QT_CONFIG(evdev)
if (function == QEglFSFunctions::loadKeymapTypeIdentifier())
return QFunctionPointer(loadKeymapStatic);
else if (function == QEglFSFunctions::switchLangTypeIdentifier())
return QFunctionPointer(switchLangStatic);
#endif
return qt_egl_device_integration()->platformFunction(function);
}
void QEglFSIntegration::loadKeymapStatic(const QString &filename)
{
#if QT_CONFIG(evdev)
QEglFSIntegration *self = static_cast<QEglFSIntegration *>(QGuiApplicationPrivate::platformIntegration());
if (self->m_kbdMgr)
self->m_kbdMgr->loadKeymap(filename);
void QEglFSIntegration::loadKeymap(const QString &filename)
{
if (m_kbdMgr)
m_kbdMgr->loadKeymap(filename);
else
qWarning("QEglFSIntegration: Cannot load keymap, no keyboard handler found");
#else
Q_UNUSED(filename);
#endif
}
void QEglFSIntegration::switchLangStatic()
void QEglFSIntegration::switchLang()
{
#if QT_CONFIG(evdev)
QEglFSIntegration *self = static_cast<QEglFSIntegration *>(QGuiApplicationPrivate::platformIntegration());
if (self->m_kbdMgr)
self->m_kbdMgr->switchLang();
if (m_kbdMgr)
m_kbdMgr->switchLang();
else
qWarning("QEglFSIntegration: Cannot switch language, no keyboard handler found");
#endif
}
#endif
void QEglFSIntegration::createInputHandlers()
{

View File

@ -59,6 +59,7 @@
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qplatformopenglcontext.h>
#include <qpa/qplatformscreen.h>
#include <QtGui/private/qkeymapper_p.h>
QT_BEGIN_NAMESPACE
@ -68,8 +69,11 @@ class QFbVtHandler;
class QEvdevKeyboardManager;
class Q_EGLFS_EXPORT QEglFSIntegration : public QPlatformIntegration, public QPlatformNativeInterface
#if QT_CONFIG(evdev)
, public QPlatformInterface::Private::QEvdevKeyMapper
#endif
#ifndef QT_NO_OPENGL
, public QPlatformInterface::Private::QEGLIntegration
, public QPlatformInterface::Private::QEGLIntegration
#endif
{
public:
@ -116,11 +120,14 @@ public:
QPointer<QWindow> pointerWindow() { return m_pointerWindow; }
void setPointerWindow(QWindow *pointerWindow) { m_pointerWindow = pointerWindow; }
#if QT_CONFIG(evdev)
void loadKeymap(const QString &filename) override;
void switchLang() override;
#endif
private:
EGLNativeDisplayType nativeDisplay() const;
void createInputHandlers();
static void loadKeymapStatic(const QString &filename);
static void switchLangStatic();
EGLDisplay m_display;
QPlatformInputContext *m_inputContext;

View File

@ -70,8 +70,6 @@
#include <QtInputSupport/private/qtslib_p.h>
#endif
#include <QtPlatformHeaders/private/qlinuxfbfunctions_p.h>
QT_BEGIN_NAMESPACE
QLinuxFbIntegration::QLinuxFbIntegration(const QStringList &paramList)
@ -181,40 +179,26 @@ QPlatformNativeInterface *QLinuxFbIntegration::nativeInterface() const
QFunctionPointer QLinuxFbIntegration::platformFunction(const QByteArray &function) const
{
#if QT_CONFIG(evdev)
if (function == QLinuxFbFunctions::loadKeymapTypeIdentifier())
return QFunctionPointer(loadKeymapStatic);
else if (function == QLinuxFbFunctions::switchLangTypeIdentifier())
return QFunctionPointer(switchLangStatic);
#else
Q_UNUSED(function);
#endif
return 0;
}
void QLinuxFbIntegration::loadKeymapStatic(const QString &filename)
{
#if QT_CONFIG(evdev)
QLinuxFbIntegration *self = static_cast<QLinuxFbIntegration *>(QGuiApplicationPrivate::platformIntegration());
if (self->m_kbdMgr)
self->m_kbdMgr->loadKeymap(filename);
void QLinuxFbIntegration::loadKeymap(const QString &filename)
{
if (m_kbdMgr)
m_kbdMgr->loadKeymap(filename);
else
qWarning("QLinuxFbIntegration: Cannot load keymap, no keyboard handler found");
#else
Q_UNUSED(filename);
#endif
}
void QLinuxFbIntegration::switchLangStatic()
void QLinuxFbIntegration::switchLang()
{
#if QT_CONFIG(evdev)
QLinuxFbIntegration *self = static_cast<QLinuxFbIntegration *>(QGuiApplicationPrivate::platformIntegration());
if (self->m_kbdMgr)
self->m_kbdMgr->switchLang();
if (m_kbdMgr)
m_kbdMgr->switchLang();
else
qWarning("QLinuxFbIntegration: Cannot switch language, no keyboard handler found");
#endif
}
#endif
QT_END_NAMESPACE

View File

@ -42,6 +42,7 @@
#include <qpa/qplatformintegration.h>
#include <qpa/qplatformnativeinterface.h>
#include <QtGui/private/qkeymapper_p.h>
QT_BEGIN_NAMESPACE
@ -51,6 +52,9 @@ class QFbVtHandler;
class QEvdevKeyboardManager;
class QLinuxFbIntegration : public QPlatformIntegration, public QPlatformNativeInterface
#if QT_CONFIG(evdev)
, public QPlatformInterface::Private::QEvdevKeyMapper
#endif
{
public:
QLinuxFbIntegration(const QStringList &paramList);
@ -74,10 +78,13 @@ public:
QFunctionPointer platformFunction(const QByteArray &function) const override;
#if QT_CONFIG(evdev)
void loadKeymap(const QString &filename) override;
void switchLang() override;
#endif
private:
void createInputHandlers();
static void loadKeymapStatic(const QString &filename);
static void switchLangStatic();
QFbScreen *m_primaryScreen;
QPlatformInputContext *m_inputContext;