summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/udev
diff options
context:
space:
mode:
authorJohannes Zellner <johannes.zellner@nokia.com>2012-05-21 15:41:58 -0700
committerQt by Nokia <qt-info@nokia.com>2012-05-24 07:15:02 +0200
commitce5c1db2d3db7d7c7af28e9053ca591f76c6101c (patch)
tree60ef0eac7ad658e9715f2a940dbf7c5a3b6787a4 /src/platformsupport/udev
parent7dd64fd2bbb18a424577543307f2821ace963b8b (diff)
udev: UDevHelper becomes DeviceDiscovery
Rename QUDeviceHelper to QDeviceDiscovery and add a static device discovery fallback in case we dont have udev. The fallback so far only scans /dev/input/event* and /dev/dri/card* at startup and detects device nodes only by device path. Change-Id: I7a423910b30ae16a10d8f1f47b86c6b4d2c2ec36 Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com> Reviewed-by: Donald Carr <donald.carr@nokia.com>
Diffstat (limited to 'src/platformsupport/udev')
-rw-r--r--src/platformsupport/udev/qudevicehelper.cpp251
-rw-r--r--src/platformsupport/udev/qudevicehelper_p.h101
-rw-r--r--src/platformsupport/udev/udev.pri7
3 files changed, 0 insertions, 359 deletions
diff --git a/src/platformsupport/udev/qudevicehelper.cpp b/src/platformsupport/udev/qudevicehelper.cpp
deleted file mode 100644
index 0cf370badc..0000000000
--- a/src/platformsupport/udev/qudevicehelper.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qudevicehelper_p.h"
-
-#include <QStringList>
-#include <QCoreApplication>
-#include <QObject>
-#include <QHash>
-#include <QSocketNotifier>
-
-#include <linux/input.h>
-
-//#define QT_QPA_UDEVICE_HELPER_DEBUG
-
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
-#include <QtDebug>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QUDeviceHelper *QUDeviceHelper::createUDeviceHelper(QUDeviceTypes types, QObject *parent)
-{
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
- qWarning() << "Try to create new UDeviceHelper";
-#endif
-
- QUDeviceHelper *helper = 0;
- struct udev *udev;
-
- udev = udev_new();
- if (udev) {
- helper = new QUDeviceHelper(types, udev, parent);
- } else {
- qWarning("Failed to get udev library context.");
- }
-
- return helper;
-}
-
-QUDeviceHelper::QUDeviceHelper(QUDeviceTypes types, struct udev *udev, QObject *parent) :
- QObject(parent),
- m_udev(udev), m_types(types), m_udevMonitor(0), m_udevMonitorFileDescriptor(-1), m_udevSocketNotifier(0)
-{
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
- qWarning() << "New UDeviceHelper created for type" << types;
-#endif
-
- if (!m_udev)
- return;
-
- m_udevMonitor = udev_monitor_new_from_netlink(m_udev, "udev");
- if (!m_udevMonitor) {
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
- qWarning("Unable to create an Udev monitor. No devices can be detected.");
-#endif
- return;
- }
-
- udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "input", 0);
- udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "drm", 0);
- udev_monitor_enable_receiving(m_udevMonitor);
- m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor);
-
- m_udevSocketNotifier = new QSocketNotifier(m_udevMonitorFileDescriptor, QSocketNotifier::Read, this);
- connect(m_udevSocketNotifier, SIGNAL(activated(int)), this, SLOT(handleUDevNotification()));
-}
-
-QUDeviceHelper::~QUDeviceHelper()
-{
- if (m_udevMonitor)
- udev_monitor_unref(m_udevMonitor);
-
- if (m_udev)
- udev_unref(m_udev);
-}
-
-QStringList QUDeviceHelper::scanConnectedDevices()
-{
- QStringList devices;
-
- if (!m_udev)
- return devices;
-
- udev_enumerate *ue = udev_enumerate_new(m_udev);
- udev_enumerate_add_match_subsystem(ue, "input");
- udev_enumerate_add_match_subsystem(ue, "drm");
-
- if (m_types & UDev_Mouse)
- udev_enumerate_add_match_property(ue, "ID_INPUT_MOUSE", "1");
- if (m_types & UDev_Touchpad)
- udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
- if (m_types & UDev_Touchscreen)
- udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHSCREEN", "1");
- if (m_types & UDev_Keyboard)
- udev_enumerate_add_match_property(ue, "ID_INPUT_KEYBOARD", "1");
-
- if (udev_enumerate_scan_devices(ue) != 0) {
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
- qWarning() << "UDeviceHelper scan connected devices for enumeration failed";
-#endif
- return devices;
- }
-
- udev_list_entry *entry;
- udev_list_entry_foreach (entry, udev_enumerate_get_list_entry(ue)) {
- const char *syspath = udev_list_entry_get_name(entry);
- udev_device *udevice = udev_device_new_from_syspath(m_udev, syspath);
- QString candidate = QString::fromUtf8(udev_device_get_devnode(udevice));
- if ((m_types & UDev_InputMask) && candidate.startsWith(QLatin1String("/dev/input/event")))
- devices << candidate;
- if ((m_types & UDev_VideoMask) && candidate.startsWith(QLatin1String("/dev/dri/card")))
- devices << candidate;
-
- udev_device_unref(udevice);
- }
- udev_enumerate_unref(ue);
-
-#ifdef QT_QPA_UDEVICE_HELPER_DEBUG
- qWarning() << "UDeviceHelper found matching devices" << devices;
-#endif
-
- return devices;
-}
-
-void QUDeviceHelper::handleUDevNotification()
-{
- if (!m_udevMonitor)
- return;
-
- struct udev_device *dev;
- QString devNode;
- QUDeviceTypes types = QFlag(UDev_Unknown);
-
- dev = udev_monitor_receive_device(m_udevMonitor);
- if (!dev)
- goto cleanup;
-
- const char *action;
- action = udev_device_get_action(dev);
- if (!action)
- goto cleanup;
-
- const char *str;
- str = udev_device_get_devnode(dev);
- if (!str)
- goto cleanup;
-
- const char *subsystem;
- devNode = QString::fromUtf8(str);
- if (devNode.startsWith(QLatin1String("/dev/input/event")))
- subsystem = "input";
- else if (devNode.startsWith(QLatin1String("/dev/dri/card")))
- subsystem = "drm";
- else goto cleanup;
-
- types = checkDeviceType(dev);
-
- // if we cannot determine a type, walk up the device tree
- if (types == UDev_Unknown) {
- // does not increase the refcount
- dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
- if (!dev)
- goto cleanup;
-
- types = checkDeviceType(dev);
- }
-
- if (types && (qstrcmp(action, "add") == 0))
- emit deviceDetected(devNode, types);
-
- if (types && (qstrcmp(action, "remove") == 0))
- emit deviceRemoved(devNode, types);
-
-cleanup:
- udev_device_unref(dev);
-}
-
-QUDeviceHelper::QUDeviceTypes QUDeviceHelper::checkDeviceType(udev_device *dev)
-{
- QUDeviceTypes types = QFlag(UDev_Unknown);
-
- if ((m_types & UDev_Keyboard) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_KEYBOARD"), "1") == 0 )) {
- const char *capabilities_key = udev_device_get_sysattr_value(dev, "capabilities/key");
- QStringList val = QString::fromUtf8(capabilities_key).split(QString::fromUtf8(" "), QString::SkipEmptyParts);
- if (!val.isEmpty()) {
- bool ok;
- unsigned long long keys = val.last().toULongLong(&ok, 16);
- if (ok) {
- // Tests if the letter Q is valid for the device. We may want to alter this test, but it seems mostly reliable.
- bool test = (keys >> KEY_Q) & 1;
- if (test)
- types |= UDev_Keyboard;
- }
- }
- }
-
- if ((m_types & UDev_Mouse) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_MOUSE"), "1") == 0))
- types |= UDev_Mouse;
-
- if ((m_types & UDev_Touchpad) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD"), "1") == 0))
- types |= UDev_Touchpad;
-
- if ((m_types & UDev_Touchscreen) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"), "1") == 0))
- types |= UDev_Touchscreen;
-
- if ((m_types & UDev_DRM) && (qstrcmp(udev_device_get_subsystem(dev), "drm") == 0))
- types |= UDev_DRM;
-
- return types;
-}
-
-QT_END_NAMESPACE
diff --git a/src/platformsupport/udev/qudevicehelper_p.h b/src/platformsupport/udev/qudevicehelper_p.h
deleted file mode 100644
index 15dbe2926c..0000000000
--- a/src/platformsupport/udev/qudevicehelper_p.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QUDEVICEHELPER_H
-#define QUDEVICEHELPER_H
-
-#include <QObject>
-#include <QSocketNotifier>
-
-#include <libudev.h>
-
-QT_BEGIN_NAMESPACE
-
-class QUDeviceHelper : public QObject
-{
- Q_OBJECT
- Q_ENUMS(QUDeviceType)
-
-public:
- enum QUDeviceType {
- UDev_Unknown = 0x00,
- UDev_Mouse = 0x01,
- UDev_Touchpad = 0x02,
- UDev_Touchscreen = 0x04,
- UDev_Keyboard = 0x08,
- UDev_DRM = 0x10,
- UDev_InputMask = UDev_Mouse | UDev_Touchpad | UDev_Touchscreen | UDev_Keyboard,
- UDev_VideoMask = UDev_DRM
- };
- Q_DECLARE_FLAGS(QUDeviceTypes, QUDeviceType)
-
- static QUDeviceHelper *createUDeviceHelper(QUDeviceTypes type, QObject *parent);
- ~QUDeviceHelper();
-
- QStringList scanConnectedDevices();
-
-signals:
- void deviceDetected(const QString &deviceNode, QUDeviceTypes types);
- void deviceRemoved(const QString &deviceNode, QUDeviceTypes types);
-
-private slots:
- void handleUDevNotification();
-
-private:
- QUDeviceHelper(QUDeviceTypes types, struct udev *udev, QObject *parent = 0);
-
- void startWatching();
- void stopWatching();
-
- QUDeviceTypes checkDeviceType(struct udev_device *dev);
-
- struct udev *m_udev;
- QUDeviceTypes m_types;
- struct udev_monitor *m_udevMonitor;
- int m_udevMonitorFileDescriptor;
- QSocketNotifier *m_udevSocketNotifier;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QUDeviceHelper::QUDeviceTypes)
-
-QT_END_NAMESPACE
-
-#endif // QUDEVICEHELPER_H
diff --git a/src/platformsupport/udev/udev.pri b/src/platformsupport/udev/udev.pri
deleted file mode 100644
index e3d7f2dadc..0000000000
--- a/src/platformsupport/udev/udev.pri
+++ /dev/null
@@ -1,7 +0,0 @@
-contains(QT_CONFIG, libudev) {
- HEADERS += $$PWD/qudevicehelper_p.h
- SOURCES += $$PWD/qudevicehelper.cpp
-
- INCLUDEPATH += $$QMAKE_INCDIR_LIBUDEV
- LIBS += $$QMAKE_LIBS_LIBUDEV
-}