From 5b1befa31a9851397d56363f058568094d11f5f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 17 Jul 2020 23:31:41 +0200 Subject: Add QEvdevKeyMapper platform interface Task-number: QTBUG-84220 Change-Id: I4f3a54415c5509b4bde486b54c56b0e05976bac6 Reviewed-by: Friedemann Kleint --- src/gui/kernel/qkeymapper_p.h | 19 +++++ src/gui/platform/unix/qunixplatforminterface.cpp | 12 +++ src/platformheaders/.prev_CMakeLists.txt | 1 - src/platformheaders/CMakeLists.txt | 1 - .../eglfsfunctions/qeglfsfunctions.qdoc | 43 ----------- .../eglfsfunctions/qeglfsfunctions_p.h | 19 ----- .../linuxfbfunctions/linuxfbfunctions.pri | 1 - .../linuxfbfunctions/qlinuxfbfunctions.qdoc | 82 --------------------- .../linuxfbfunctions/qlinuxfbfunctions_p.h | 85 ---------------------- src/platformheaders/platformheaders.pro | 1 - .../platforms/eglfs/api/qeglfsintegration.cpp | 29 ++------ .../platforms/eglfs/api/qeglfsintegration_p.h | 13 +++- .../platforms/linuxfb/qlinuxfbintegration.cpp | 32 ++------ .../platforms/linuxfb/qlinuxfbintegration.h | 11 ++- 14 files changed, 66 insertions(+), 283 deletions(-) delete mode 100644 src/platformheaders/linuxfbfunctions/linuxfbfunctions.pri delete mode 100644 src/platformheaders/linuxfbfunctions/qlinuxfbfunctions.qdoc delete mode 100644 src/platformheaders/linuxfbfunctions/qlinuxfbfunctions_p.h diff --git a/src/gui/kernel/qkeymapper_p.h b/src/gui/kernel/qkeymapper_p.h index cb77deb6ba..9abdbbb732 100644 --- a/src/gui/kernel/qkeymapper_p.h +++ b/src/gui/kernel/qkeymapper_p.h @@ -72,6 +72,9 @@ public: static void changeKeyboard(); static QList possibleKeys(QKeyEvent *e); + template + 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 diff --git a/src/gui/platform/unix/qunixplatforminterface.cpp b/src/gui/platform/unix/qunixplatforminterface.cpp index 5806fe57e9..527c5210d7 100644 --- a/src/gui/platform/unix/qunixplatforminterface.cpp +++ b/src/gui/platform/unix/qunixplatforminterface.cpp @@ -47,6 +47,8 @@ #include #include +#include + 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() const +{ + return dynamic_cast(QGuiApplicationPrivate::platformIntegration()); +} +#endif + #endif // QT_NO_OPENGL QT_END_NAMESPACE diff --git a/src/platformheaders/.prev_CMakeLists.txt b/src/platformheaders/.prev_CMakeLists.txt index c4477d6a8e..c7cfe0ca69 100644 --- a/src/platformheaders/.prev_CMakeLists.txt +++ b/src/platformheaders/.prev_CMakeLists.txt @@ -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 diff --git a/src/platformheaders/CMakeLists.txt b/src/platformheaders/CMakeLists.txt index ba91c11642..eaa0db8f10 100644 --- a/src/platformheaders/CMakeLists.txt +++ b/src/platformheaders/CMakeLists.txt @@ -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 diff --git a/src/platformheaders/eglfsfunctions/qeglfsfunctions.qdoc b/src/platformheaders/eglfsfunctions/qeglfsfunctions.qdoc index a5f37f8377..573d820233 100644 --- a/src/platformheaders/eglfsfunctions/qeglfsfunctions.qdoc +++ b/src/platformheaders/eglfsfunctions/qeglfsfunctions.qdoc @@ -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 diff --git a/src/platformheaders/eglfsfunctions/qeglfsfunctions_p.h b/src/platformheaders/eglfsfunctions/qeglfsfunctions_p.h index 1eb177f694..2b0ff872ac 100644 --- a/src/platformheaders/eglfsfunctions/qeglfsfunctions_p.h +++ b/src/platformheaders/eglfsfunctions/qeglfsfunctions_p.h @@ -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(QGuiApplication::platformFunction(loadKeymapTypeIdentifier())); - if (func) - func(filename); - } - - static void switchLang() - { - SwitchLangType func = reinterpret_cast(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"); } diff --git a/src/platformheaders/linuxfbfunctions/linuxfbfunctions.pri b/src/platformheaders/linuxfbfunctions/linuxfbfunctions.pri deleted file mode 100644 index dd18d6c0bb..0000000000 --- a/src/platformheaders/linuxfbfunctions/linuxfbfunctions.pri +++ /dev/null @@ -1 +0,0 @@ -HEADERS += $$PWD/qlinuxfbfunctions_p.h diff --git a/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions.qdoc b/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions.qdoc deleted file mode 100644 index 939aa76946..0000000000 --- a/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions.qdoc +++ /dev/null @@ -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. -*/ diff --git a/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions_p.h b/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions_p.h deleted file mode 100644 index 74e5187282..0000000000 --- a/src/platformheaders/linuxfbfunctions/qlinuxfbfunctions_p.h +++ /dev/null @@ -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 -#include - -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(QGuiApplication::platformFunction(loadKeymapTypeIdentifier())); - if (func) - func(filename); - } - - static void switchLang() - { - SwitchLangType func = reinterpret_cast(QGuiApplication::platformFunction(switchLangTypeIdentifier())); - if (func) - func(); - } -}; - - -QT_END_NAMESPACE - -#endif // QLINUXFBFUNCTIONS_H diff --git a/src/platformheaders/platformheaders.pro b/src/platformheaders/platformheaders.pro index e988e2e87c..e7edbc60b1 100644 --- a/src/platformheaders/platformheaders.pro +++ b/src/platformheaders/platformheaders.pro @@ -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 diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp index 3ce78623fa..befab97baa 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp @@ -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(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(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() { diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h index babcbfaaa4..9bc24f36f9 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h @@ -59,6 +59,7 @@ #include #include #include +#include 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 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; diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp index cea486db21..61c4fdf768 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp @@ -70,8 +70,6 @@ #include #endif -#include - QT_BEGIN_NAMESPACE QLinuxFbIntegration::QLinuxFbIntegration(const QStringList ¶mList) @@ -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(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(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 diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.h b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h index af6bd1d630..1e671ee7fc 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.h +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h @@ -42,6 +42,7 @@ #include #include +#include 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 ¶mList); @@ -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; -- cgit v1.2.3