summaryrefslogtreecommitdiff
path: root/x11/kde-workspace-kde4/files/patch-usbview
diff options
context:
space:
mode:
Diffstat (limited to 'x11/kde-workspace-kde4/files/patch-usbview')
-rw-r--r--x11/kde-workspace-kde4/files/patch-usbview493
1 files changed, 493 insertions, 0 deletions
diff --git a/x11/kde-workspace-kde4/files/patch-usbview b/x11/kde-workspace-kde4/files/patch-usbview
new file mode 100644
index 000000000000..9c56664bb6ce
--- /dev/null
+++ b/x11/kde-workspace-kde4/files/patch-usbview
@@ -0,0 +1,493 @@
+ Use libusb-1 to query info about usb devices on all platforms, leave old
+ method as a fallback for Linux only.
+ Remove *BSD specific code, it doesn't work on FreeBSD 8.x and greater.
+ Old code probably works on NetBSD, but let it use libusb-1 as well.
+ Use DeviceNotifier instead of polling.
+
+--- cmake/modules/FindLibUSB1.cmake.orig 2016-12-13 11:26:31 UTC
++++ cmake/modules/FindLibUSB1.cmake
+@@ -0,0 +1,21 @@
++# - Try to find libusb v1.0 library
++# Once done this defines
++#
++# LIBUSB1_FOUND - system has libusb
++# LIBUSB1_INCLUDE_DIR - libusb include directory
++# LIBUSB1_LIBRARY - libusb library
++
++find_package(PkgConfig)
++pkg_check_modules(PC_LIBUSB1 QUIET libusb-1.0)
++
++find_path(LIBUSB1_INCLUDE_DIR libusb.h
++ HINTS ${PC_LIBUSB1_INCLUDEDIR} ${PC_LIBUSB1_INCLUDE_DIRS})
++
++# On FreeBSD libusb provides both v0.1 and v1.0 API
++find_library(LIBUSB1_LIBRARY NAMES usb-1.0 usb
++ HINTS ${PC_LIBUSB1_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS})
++
++include(FindPackageHandleStandardArgs)
++find_package_handle_standard_args(LIBUSB1 DEFAULT_MSG LIBUSB1_LIBRARY LIBUSB1_INCLUDE_DIR)
++
++mark_as_advanced(LIBUSB1_INCLUDE_DIR LIBUSB1_LIBRARY)
+--- kinfocenter/Modules/usbview/CMakeLists.txt.orig 2015-06-26 03:17:21 UTC
++++ kinfocenter/Modules/usbview/CMakeLists.txt
+@@ -1,15 +1,25 @@
++macro_optional_find_package(LibUSB1)
++macro_bool_to_01(LIBUSB1_FOUND HAVE_LIBUSB1)
++macro_log_feature(LIBUSB1_FOUND "libusb-1" "User level access to USB devices" "http://libusb.sourceforge.net/" FALSE "" "Provides usb info support in KControl.")
+
+-
++configure_file (config-kcmusb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kcmusb.h )
+
+ ########### next target ###############
+
++if (LIBUSB1_FOUND)
++ include_directories( ${LIBUSB1_INCLUDE_DIR} )
++endif (LIBUSB1_FOUND)
++
+ set(kcm_usb_PART_SRCS kcmusb.cpp usbdevices.cpp usbdb.cpp )
+
+
+ kde4_add_plugin(kcm_usb ${kcm_usb_PART_SRCS})
+
+
+-target_link_libraries(kcm_usb ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY})
++target_link_libraries(kcm_usb ${KDE4_KDEUI_LIBS} ${KDE4_SOLID_LIBS} ${QT_QTGUI_LIBRARY})
++if (LIBUSB1_FOUND)
++ target_link_libraries(kcm_usb ${LIBUSB1_LIBRARY})
++endif (LIBUSB1_FOUND)
+
+ install(TARGETS kcm_usb DESTINATION ${PLUGIN_INSTALL_DIR} )
+
+--- kinfocenter/Modules/usbview/config-kcmusb.h.cmake.orig 2016-12-13 11:26:31 UTC
++++ kinfocenter/Modules/usbview/config-kcmusb.h.cmake
+@@ -0,0 +1,2 @@
++/* Defined if you have libusb */
++#cmakedefine HAVE_LIBUSB1 1
+--- kinfocenter/Modules/usbview/kcmusb.cpp.orig 2015-06-26 03:17:21 UTC
++++ kinfocenter/Modules/usbview/kcmusb.cpp
+@@ -12,7 +12,6 @@
+ #include <QLayout>
+ #include <QSplitter>
+ #include <QtGui/QTextEdit>
+-#include <QTimer>
+ #include <QHBoxLayout>
+ #include <QList>
+ #include <QTreeWidget>
+@@ -20,6 +19,7 @@
+
+ #include <kaboutdata.h>
+ #include <kdialog.h>
++#include <solid/devicenotifier.h>
+
+ #include <KPluginFactory>
+ #include <KPluginLoader>
+@@ -63,11 +63,8 @@ USBViewer::USBViewer(QWidget *parent, co
+ _details = new QTextEdit(splitter);
+ _details->setReadOnly(true);
+
+- QTimer *refreshTimer = new QTimer(this);
+- // 1 sec seems to be a good compromise between latency and polling load.
+- refreshTimer->start(1000);
+-
+- connect(refreshTimer, SIGNAL(timeout()), SLOT(refresh()));
++ connect(Solid::DeviceNotifier::instance(),SIGNAL(deviceAdded(QString)), SLOT(refresh()));
++ connect(Solid::DeviceNotifier::instance(),SIGNAL(deviceRemoved(const QString)), SLOT(refresh()));
+ connect(_devices, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(selectionChanged(QTreeWidgetItem*)));
+
+ KAboutData *about = new KAboutData(I18N_NOOP("kcmusb"), 0, ki18n("KDE USB Viewer"),
+@@ -113,8 +110,12 @@ static void delete_recursive(QTreeWidget
+ void USBViewer::refresh() {
+ QMap<int, QTreeWidgetItem*> new_items;
+
++#if defined(HAVE_LIBUSB1)
++ USBDevice::parse();
++#else
+ if (!USBDevice::parse("/proc/bus/usb/devices"))
+ USBDevice::parseSys("/sys/bus/usb/devices");
++#endif
+
+ int level = 0;
+ bool found = true;
+--- kinfocenter/Modules/usbview/usbdevices.cpp.orig 2015-06-26 03:17:21 UTC
++++ kinfocenter/Modules/usbview/usbdevices.cpp
+@@ -27,9 +27,9 @@
+
+ #include <math.h>
+
+-#if defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
+-#include <sys/ioctl.h>
+-#include <sys/param.h>
++#include <config-kcmusb.h>
++#if defined(HAVE_LIBUSB1)
++#include <libusb.h>
+ #endif
+
+ QList<USBDevice*> USBDevice::_devices;
+@@ -48,6 +48,7 @@ USBDevice::~USBDevice() {
+
+ }
+
++#if !defined(HAVE_LIBUSB1)
+ static QString catFile(QString fname) {
+ char buffer[256];
+ QString result;
+@@ -129,6 +130,7 @@ void USBDevice::parseLine(const QString&
+ } else if (line.startsWith("P:"))
+ sscanf(line.toLocal8Bit().data(), "P: Vendor=%x ProdID=%x Rev=%x.%x", &_vendorID, &_prodID, &_revMajor, &_revMinor);
+ }
++#endif // !defined(HAVE_LIBUSB1)
+
+ USBDevice* USBDevice::find(int bus, int device) {
+ foreach(USBDevice* usbDevice, _devices) {
+@@ -160,6 +162,10 @@ QString USBDevice::dump() {
+
+ r += "<br/><table>";
+
++ r += i18n("<tr><td><i>Bus number</i></td><td>%1</td></tr>", _bus);
++ r += i18n("<tr><td><i>Device address</i></td><td>%1</td></tr>", _device);
++ r += "<tr><td></td></tr>";
++
+ QString c = QString("<td>%1</td>").arg(_class);
+ QString cname = _db->cls(_class);
+ if (!cname.isEmpty())
+@@ -175,11 +181,9 @@ QString USBDevice::dump() {
+ if (!prname.isEmpty())
+ pr += "<td>(" + prname +")</td>";
+ r += i18n("<tr><td><i>Protocol</i></td>%1</tr>", pr);
+-#if !(defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD))
+ r += ki18n("<tr><td><i>USB Version</i></td><td>%1.%2</td></tr>")
+ .subs(_verMajor,0,16).subs(_verMinor,2,16,QChar::fromLatin1('0'))
+ .toString();
+-#endif
+ r += "<tr><td></td></tr>";
+
+ QString v = QString::number(_vendorID, 16);
+@@ -198,22 +202,15 @@ QString USBDevice::dump() {
+ r += "<tr><td></td></tr>";
+
+ r += i18n("<tr><td><i>Speed</i></td><td>%1 Mbit/s</td></tr>", _speed);
+- r += i18n("<tr><td><i>Channels</i></td><td>%1</td></tr>", _channels);
+-#if (defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)) && !defined(DISABLE_USBDEVICES_FREEBSD)
+- if ( _power )
++#if defined(HAVE_LIBUSB1)
++ if ( _power != -1 )
+ r += i18n("<tr><td><i>Power Consumption</i></td><td>%1 mA</td></tr>", _power);
+ else
+- r += i18n("<tr><td><i>Power Consumption</i></td><td>self powered</td></tr>");
+- r += i18n("<tr><td><i>Attached Devicenodes</i></td><td>%1</td></tr>", _devnodes.at(0));
+- if ( _devnodes.count() > 1 ) {
+- QStringList::const_iterator it = _devnodes.constBegin();
+- ++it;
+- for (; it != _devnodes.constEnd(); ++it )
+- r += "<tr><td></td><td>" + *it + "</td></tr>";
+- }
+-#else
++ r += i18n("<tr><td><i>Power Consumption</i></td><td>unknown</td></tr>");
++#else // defined(HAVE_LIBUSB1)
++ r += i18n("<tr><td><i>Channels</i></td><td>%1</td></tr>", _channels);
++#endif // defined(HAVE_LIBUSB1)
+ r += i18n("<tr><td><i>Max. Packet Size</i></td><td>%1</td></tr>", _maxPacketSize);
+-#endif
+ r += "<tr><td></td></tr>";
+
+ if (_hasBW) {
+@@ -228,7 +225,82 @@ QString USBDevice::dump() {
+ return r;
+ }
+
+-#if !(defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD))
++#if defined(HAVE_LIBUSB1)
++
++void USBDevice::dump_usbdev_info(libusb_device *dev) {
++
++ _bus = libusb_get_bus_number(dev);
++ _device = libusb_get_device_address(dev);
++
++ switch (libusb_get_device_speed(dev)) {
++ case LIBUSB_SPEED_LOW: _speed = 1.5; break;
++ case LIBUSB_SPEED_FULL: _speed = 12; break;
++ case LIBUSB_SPEED_HIGH: _speed = 480; break;
++ case LIBUSB_SPEED_SUPER: _speed = 5000; break;
++ }
++
++ struct libusb_config_descriptor *conf;
++ if (libusb_get_active_config_descriptor(dev, &conf) == 0) {
++ _power = conf->MaxPower;
++ libusb_free_config_descriptor(conf);
++ } else {
++ _power = -1;
++ }
++
++ struct libusb_device_descriptor desc;
++ if (libusb_get_device_descriptor(dev, &desc) == 0) {
++ _verMajor = desc.bcdUSB >> 8;
++ _verMinor = desc.bcdUSB & 0x00FF;
++ _class = desc.bDeviceClass;
++ _sub = desc.bDeviceSubClass;
++ _prot = desc.bDeviceProtocol;
++ _maxPacketSize = desc.bMaxPacketSize0;
++ _configs = desc.bNumConfigurations;
++ _vendorID = desc.idVendor;
++ _prodID = desc.idProduct;
++ _revMajor = desc.bcdDevice >> 8;
++ _revMinor = desc.bcdDevice & 0x00FF;
++ }
++
++ libusb_device_handle *hdev;
++ uchar buf[256];
++ if (libusb_open(dev, &hdev) == 0) {
++ if (libusb_get_string_descriptor_ascii(hdev, desc.iManufacturer, buf, sizeof(buf)) > 0)
++ _manufacturer = (char*) buf;
++ if (libusb_get_string_descriptor_ascii(hdev, desc.iProduct, buf, sizeof(buf)) > 0)
++ _product = (char*) buf;
++ if (libusb_get_string_descriptor_ascii(hdev, desc.iSerialNumber, buf, sizeof(buf)) > 0)
++ _serial = (char*) buf;
++ libusb_close(hdev);
++ }
++}
++
++bool USBDevice::parse() {
++ _devices.clear();
++
++ int r = libusb_init(NULL);
++ if (r != 0)
++ return false;
++
++ libusb_device **devs;
++ ssize_t cnt = libusb_get_device_list(NULL, &devs);
++ if (cnt < 0)
++ return false;
++
++ libusb_device *dev;
++ int i = 0;
++ while ((dev = devs[i++]) != NULL) {
++ USBDevice* device = new USBDevice();
++ device->dump_usbdev_info(dev);
++ }
++ libusb_free_device_list(devs, 1);
++
++ libusb_exit(NULL);
++ return true;
++}
++
++#else // defined(HAVE_LIBUSB1)
++#if defined(Q_OS_LINUX)
+ bool USBDevice::parse(const QString &fname) {
+ _devices.clear();
+
+@@ -290,146 +362,19 @@ bool USBDevice::parseSys(const QString &
+ return d.count();
+ }
+
+-#else
+-
+-// Unused by *BSD
+-bool USBDevice::parseSys(const QString &fname)
+-{
+- Q_UNUSED(fname)
+-
+- return true;
+-}
+-
+-# if defined(DISABLE_USBDEVICES_FREEBSD)
+-
+-/*
+- * FIXME: The USB subsystem has changed a lot in FreeBSD 8.0
+- * Support for it must be written.
+- */
++#else // defined(Q_OS_LINUX)
+
+-bool USBDevice::parse(const QString &fname)
+-{
++bool USBDevice::parse(const QString &fname) {
+ Q_UNUSED(fname)
+
+ return true;
+ }
+
+-# else
+-
+-/*
+- * FreeBSD support by Markus Brueffer <markus@brueffer.de>
+- *
+- * Basic idea and some code fragments were taken from FreeBSD's usbdevs(8),
+- * originally developed for NetBSD, so this code should work with no or
+- * only little modification on NetBSD.
+- */
+-
+-void USBDevice::collectData( int fd, int level, usb_device_info &di, int parent)
+-{
+- // determine data for this device
+- _level = level;
+- _parent = parent;
+-
+- _bus = di.udi_bus;
+- _device = di.udi_addr;
+- _product = QLatin1String(di.udi_product);
+- if ( _device == 1 )
+- _product += ' ' + QString::number( _bus );
+- _manufacturer = QLatin1String(di.udi_vendor);
+- _prodID = di.udi_productNo;
+- _vendorID = di.udi_vendorNo;
+- _class = di.udi_class;
+- _sub = di.udi_subclass;
+- _prot = di.udi_protocol;
+- _power = di.udi_power;
+- _channels = di.udi_nports;
+-
+- // determine the speed
+-#if defined(__DragonFly__) || (defined(Q_OS_FREEBSD) && __FreeBSD_version > 490102) || defined(Q_OS_NETBSD)
+- switch (di.udi_speed) {
+- case USB_SPEED_LOW: _speed = 1.5; break;
+- case USB_SPEED_FULL: _speed = 12.0; break;
+- case USB_SPEED_HIGH: _speed = 480.0; break;
+- }
+-#else
+- _speed = di.udi_lowspeed ? 1.5 : 12.0;
+-#endif
+-
+- // Get all attached devicenodes
+- for ( int i = 0; i < USB_MAX_DEVNAMES; ++i )
+- if ( di.udi_devnames[i][0] )
+- _devnodes << di.udi_devnames[i];
+-
+- // For compatibility, split the revision number
+- sscanf( di.udi_release, "%x.%x", &_revMajor, &_revMinor );
+-
+- // Cycle through the attached devices if there are any
+- for ( int p = 0; p < di.udi_nports; ++p ) {
+- // Get data for device
+- struct usb_device_info di2;
+-
+- di2.udi_addr = di.udi_ports[p];
+-
+- if ( di2.udi_addr >= USB_MAX_DEVICES )
+- continue;
+-
+- if ( ioctl(fd, USB_DEVICEINFO, &di2) == -1 )
+- continue;
+-
+- // Only add the device if we didn't detect it, yet
+- if (!find( di2.udi_bus, di2.udi_addr ) )
+- {
+- USBDevice *device = new USBDevice();
+- device->collectData( fd, level + 1, di2, di.udi_addr );
+- }
+- }
+-}
+-
+-bool USBDevice::parse(const QString &fname)
+-{
+- Q_UNUSED(fname)
+-
+- static bool showErrorMessage = true;
+- bool error = false;
+- _devices.clear();
+-
+- QFile controller("/dev/usb0");
+- int i = 1;
+- while ( controller.exists() )
+- {
+- // If the devicenode exists, continue with further inspection
+- if ( controller.open(QIODevice::ReadOnly) )
+- {
+- for ( int addr = 1; addr < USB_MAX_DEVICES; ++addr )
+- {
+- struct usb_device_info di;
+-
+- di.udi_addr = addr;
+- if ( ioctl(controller.handle(), USB_DEVICEINFO, &di) != -1 )
+- {
+- if (!find( di.udi_bus, di.udi_addr ) )
+- {
+- USBDevice *device = new USBDevice();
+- device->collectData( controller.handle(), 0, di, 0);
+- }
+- }
+- }
+- controller.close();
+-#ifndef Q_OS_NETBSD
+- } else {
+- error = true;
+-#endif
+- }
+- controller.setFileName( QString::fromLocal8Bit("/dev/usb%1").arg(i++) );
+- }
+-
+- if ( showErrorMessage && error ) {
+- showErrorMessage = false;
+- KMessageBox::error( 0, i18n("Could not open one or more USB controller. Make sure, you have read access to all USB controllers that should be listed here."));
+- }
++bool USBDevice::parseSys(const QString &dname) {
++ Q_UNUSED(dname)
+
+ return true;
+ }
+
+-# endif // defined(DISABLE_USBDEVICES_FREEBSD)
+-#endif // !(defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD))
++#endif // defined(Q_OS_LINUX)
++#endif // defined(HAVE_LIBUSB1)
+--- kinfocenter/Modules/usbview/usbdevices.h.orig 2015-06-26 03:17:21 UTC
++++ kinfocenter/Modules/usbview/usbdevices.h
+@@ -14,18 +14,9 @@
+ #include <QList>
+ #include <QString>
+
+-#if defined(__DragonFly__)
+-#include <bus/usb/usb.h>
+-#include <QStringList>
+-#elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
+-#include <sys/param.h>
+-# if defined(__FreeBSD_version) && __FreeBSD_version >= 800100
+-# define DISABLE_USBDEVICES_FREEBSD
+-# warning "The USB subsystem has changed in 8.0. Disabling."
+-# else
+-# include <dev/usb/usb.h>
+-# include <QStringList>
+-# endif
++#include <config-kcmusb.h>
++#if defined(HAVE_LIBUSB1)
++#include <libusb.h>
+ #endif
+
+ class USBDB;
+@@ -36,10 +27,12 @@ public:
+ USBDevice();
+
+ ~USBDevice();
+-
++#if defined(HAVE_LIBUSB1)
++ void dump_usbdev_info(libusb_device *dev);
++#else
+ void parseLine(const QString &line);
+ void parseSysDir(int bus, int parent, int level, const QString &line);
+-
++#endif
+ int level() const {
+ return _level;
+ }
+@@ -60,8 +53,12 @@ public:
+ return _devices;
+ }
+ static USBDevice *find(int bus, int device);
++#if defined(HAVE_LIBUSB1)
++ static bool parse();
++#else
+ static bool parse(const QString& fname);
+ static bool parseSys(const QString& fname);
++#endif
+
+ private:
+
+@@ -82,10 +79,6 @@ private:
+
+ unsigned int _vendorID, _prodID, _revMajor, _revMinor;
+
+-#if (defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)) && !defined(DISABLE_USBDEVICES_FREEBSD)
+- void collectData( int fd, int level, usb_device_info &di, int parent );
+- QStringList _devnodes;
+-#endif
+ };
+
+ #endif