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 plugins 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 "qlinuxfbintegration.h"
41#include "qlinuxfbscreen.h"
42#if QT_CONFIG(kms)
43#include "qlinuxfbdrmscreen.h"
44#endif
45
46#include <QtFontDatabaseSupport/private/qgenericunixfontdatabase_p.h>
47#include <QtServiceSupport/private/qgenericunixservices_p.h>
48#include <QtEventDispatcherSupport/private/qgenericunixeventdispatcher_p.h>
49
50#include <QtFbSupport/private/qfbvthandler_p.h>
51#include <QtFbSupport/private/qfbbackingstore_p.h>
52#include <QtFbSupport/private/qfbwindow_p.h>
53#include <QtFbSupport/private/qfbcursor_p.h>
54
55#include <QtGui/private/qguiapplication_p.h>
56#include <qpa/qplatforminputcontextfactory_p.h>
57#include <qpa/qwindowsysteminterface.h>
58
59#if QT_CONFIG(libinput)
60#include <QtInputSupport/private/qlibinputhandler_p.h>
61#endif
62
63#if QT_CONFIG(evdev)
64#include <QtInputSupport/private/qevdevmousemanager_p.h>
65#include <QtInputSupport/private/qevdevkeyboardmanager_p.h>
66#include <QtInputSupport/private/qevdevtouchmanager_p.h>
67#endif
68
69#if QT_CONFIG(tslib)
70#include <QtInputSupport/private/qtslib_p.h>
71#endif
72
73#include <QtPlatformHeaders/qlinuxfbfunctions.h>
74
75QT_BEGIN_NAMESPACE
76
77QLinuxFbIntegration::QLinuxFbIntegration(const QStringList &paramList)
78 : m_primaryScreen(nullptr),
79 m_fontDb(new QGenericUnixFontDatabase),
80 m_services(new QGenericUnixServices),
81 m_kbdMgr(0)
82{
83#if QT_CONFIG(kms)
84 if (qEnvironmentVariableIntValue(varName: "QT_QPA_FB_DRM") != 0)
85 m_primaryScreen = new QLinuxFbDrmScreen(paramList);
86#endif
87 if (!m_primaryScreen)
88 m_primaryScreen = new QLinuxFbScreen(paramList);
89}
90
91QLinuxFbIntegration::~QLinuxFbIntegration()
92{
93 QWindowSystemInterface::handleScreenRemoved(screen: m_primaryScreen);
94}
95
96void QLinuxFbIntegration::initialize()
97{
98 if (m_primaryScreen->initialize())
99 QWindowSystemInterface::handleScreenAdded(screen: m_primaryScreen);
100 else
101 qWarning(msg: "linuxfb: Failed to initialize screen");
102
103 m_inputContext = QPlatformInputContextFactory::create();
104
105 m_vtHandler.reset(other: new QFbVtHandler);
106
107 if (!qEnvironmentVariableIntValue(varName: "QT_QPA_FB_DISABLE_INPUT"))
108 createInputHandlers();
109}
110
111bool QLinuxFbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
112{
113 switch (cap) {
114 case ThreadedPixmaps: return true;
115 case WindowManagement: return false;
116 default: return QPlatformIntegration::hasCapability(cap);
117 }
118}
119
120QPlatformBackingStore *QLinuxFbIntegration::createPlatformBackingStore(QWindow *window) const
121{
122 return new QFbBackingStore(window);
123}
124
125QPlatformWindow *QLinuxFbIntegration::createPlatformWindow(QWindow *window) const
126{
127 return new QFbWindow(window);
128}
129
130QAbstractEventDispatcher *QLinuxFbIntegration::createEventDispatcher() const
131{
132 return createUnixEventDispatcher();
133}
134
135QList<QPlatformScreen *> QLinuxFbIntegration::screens() const
136{
137 QList<QPlatformScreen *> list;
138 list.append(t: m_primaryScreen);
139 return list;
140}
141
142QPlatformFontDatabase *QLinuxFbIntegration::fontDatabase() const
143{
144 return m_fontDb.data();
145}
146
147QPlatformServices *QLinuxFbIntegration::services() const
148{
149 return m_services.data();
150}
151
152void QLinuxFbIntegration::createInputHandlers()
153{
154#if QT_CONFIG(libinput)
155 if (!qEnvironmentVariableIntValue(varName: "QT_QPA_FB_NO_LIBINPUT")) {
156 new QLibInputHandler(QLatin1String("libinput"), QString());
157 return;
158 }
159#endif
160
161#if QT_CONFIG(tslib)
162 bool useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB");
163 if (useTslib)
164 new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
165#endif
166
167#if QT_CONFIG(evdev)
168 m_kbdMgr = new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
169 new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
170#if QT_CONFIG(tslib)
171 if (!useTslib)
172#endif
173 new QEvdevTouchManager(QLatin1String("EvdevTouch"), QString() /* spec */, this);
174#endif
175}
176
177QPlatformNativeInterface *QLinuxFbIntegration::nativeInterface() const
178{
179 return const_cast<QLinuxFbIntegration *>(this);
180}
181
182QFunctionPointer QLinuxFbIntegration::platformFunction(const QByteArray &function) const
183{
184#if QT_CONFIG(evdev)
185 if (function == QLinuxFbFunctions::loadKeymapTypeIdentifier())
186 return QFunctionPointer(loadKeymapStatic);
187 else if (function == QLinuxFbFunctions::switchLangTypeIdentifier())
188 return QFunctionPointer(switchLangStatic);
189#else
190 Q_UNUSED(function)
191#endif
192
193 return 0;
194}
195
196void QLinuxFbIntegration::loadKeymapStatic(const QString &filename)
197{
198#if QT_CONFIG(evdev)
199 QLinuxFbIntegration *self = static_cast<QLinuxFbIntegration *>(QGuiApplicationPrivate::platformIntegration());
200 if (self->m_kbdMgr)
201 self->m_kbdMgr->loadKeymap(file: filename);
202 else
203 qWarning(msg: "QLinuxFbIntegration: Cannot load keymap, no keyboard handler found");
204#else
205 Q_UNUSED(filename);
206#endif
207}
208
209void QLinuxFbIntegration::switchLangStatic()
210{
211#if QT_CONFIG(evdev)
212 QLinuxFbIntegration *self = static_cast<QLinuxFbIntegration *>(QGuiApplicationPrivate::platformIntegration());
213 if (self->m_kbdMgr)
214 self->m_kbdMgr->switchLang();
215 else
216 qWarning(msg: "QLinuxFbIntegration: Cannot switch language, no keyboard handler found");
217#endif
218}
219
220QT_END_NAMESPACE
221

source code of qtbase/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp