aboutsummaryrefslogtreecommitdiffstats
path: root/x11
diff options
context:
space:
mode:
authoralonso <alonso@FreeBSD.org>2015-03-12 07:11:47 +0800
committeralonso <alonso@FreeBSD.org>2015-03-12 07:11:47 +0800
commit7f08c01b39f7988dfc689593993896d621c448f2 (patch)
tree910a5b73adcde0c6d7935ee875c9b3fb36fecc94 /x11
parent49763a0df41c227cc1a99ec21d6fd1771b89dfc7 (diff)
downloadfreebsd-ports-graphics-7f08c01b39f7988dfc689593993896d621c448f2.tar.gz
freebsd-ports-graphics-7f08c01b39f7988dfc689593993896d621c448f2.tar.zst
freebsd-ports-graphics-7f08c01b39f7988dfc689593993896d621c448f2.zip
Update KDE SC to 4.14.3
The kde@ team presents KDE SC 4.14.3, the last planed release of the KDE SC 4 series. In addition to the updates provided by the KDE SC developers, this update also addresses numerous FreeBSD and PORTS specific issues, found and solved by the kde@ team and area51 testers, most notorously Tobias C. Berner <tcberner@gmail.com> PR: 197751 PR: 197871 PR: 184996 Reviewed by: rakuco (mentor) Differential: https://reviews.freebsd.org/D1950
Diffstat (limited to 'x11')
-rw-r--r--x11/kde4-baseapps/Makefile1
-rw-r--r--x11/kde4-baseapps/distinfo4
-rw-r--r--x11/kde4-runtime/Makefile6
-rw-r--r--x11/kde4-runtime/distinfo4
-rw-r--r--x11/kde4-runtime/files/patch-kioslave__bookmarks__kio_bookmarks.cpp25
-rw-r--r--x11/kde4-runtime/files/patch-kioslave__sftp__kio_sftp.cpp11
-rw-r--r--x11/kde4-workspace/Makefile4
-rw-r--r--x11/kde4-workspace/distinfo4
-rw-r--r--x11/kde4-workspace/files/patch-CVE-2014-8651113
-rw-r--r--x11/kde4-workspace/files/patch-kinfocenter375
-rw-r--r--x11/kde4-workspace/files/patch-kinfocenter__Modules__base__CMakeLists.txt10
-rw-r--r--x11/kde4-workspace/files/patch-usbview493
-rw-r--r--x11/kdelibs4/Makefile1
-rw-r--r--x11/kdelibs4/distinfo4
-rw-r--r--x11/kdelibs4/files/patch-git_0df92439355
-rw-r--r--x11/kgamma/distinfo4
-rw-r--r--x11/konsole/distinfo4
17 files changed, 882 insertions, 536 deletions
diff --git a/x11/kde4-baseapps/Makefile b/x11/kde4-baseapps/Makefile
index e8a6155eecb..78238bd1801 100644
--- a/x11/kde4-baseapps/Makefile
+++ b/x11/kde4-baseapps/Makefile
@@ -2,7 +2,6 @@
PORTNAME= kde-baseapps
PORTVERSION= ${KDE4_VERSION}
-PORTREVISION= 1
CATEGORIES= x11 kde
MASTER_SITES= KDE/${KDE4_BRANCH}/${PORTVERSION}/src
DIST_SUBDIR= KDE/${PORTVERSION}
diff --git a/x11/kde4-baseapps/distinfo b/x11/kde4-baseapps/distinfo
index 5017588bd7a..8907780918a 100644
--- a/x11/kde4-baseapps/distinfo
+++ b/x11/kde4-baseapps/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.14.2/kde-baseapps-4.14.2.tar.xz) = dfe3728522be0d10b1b79f54fe06b26be89b62cc88025d394c5750a31a26defe
-SIZE (KDE/4.14.2/kde-baseapps-4.14.2.tar.xz) = 2548072
+SHA256 (KDE/4.14.3/kde-baseapps-4.14.3.tar.xz) = 125baf42a7ab8c255b5829d12837f54c1791498f79593a9b09a9e55344ade6db
+SIZE (KDE/4.14.3/kde-baseapps-4.14.3.tar.xz) = 2548152
diff --git a/x11/kde4-runtime/Makefile b/x11/kde4-runtime/Makefile
index 1cdfbef31d1..0642ea14066 100644
--- a/x11/kde4-runtime/Makefile
+++ b/x11/kde4-runtime/Makefile
@@ -2,7 +2,6 @@
PORTNAME= kde-runtime
PORTVERSION= ${KDE4_VERSION}
-PORTREVISION= 3
CATEGORIES= x11 kde
MASTER_SITES= KDE/${KDE4_BRANCH}/${PORTVERSION}/src
DIST_SUBDIR= KDE/${PORTVERSION}
@@ -36,10 +35,7 @@ SHEBANG_FILES= khelpcenter/searchhandlers/*.pl \
khelpcenter/searchhandlers/*.pl.cmake \
kioslave/info/kde-info2html
-OPTIONS_DEFINE= NEPOMUK PULSEAUDIO ZEITGEIST
-
-NEPOMUK_DESC= Nepomuk semantic desktop via Virtuoso
-NEPOMUK_RUN_DEPENDS= virtuoso-t:${PORTSDIR}/databases/virtuoso
+OPTIONS_DEFINE= PULSEAUDIO ZEITGEIST
PULSEAUDIO_DESC=Audio configuration via PulseAudio
PULSEAUDIO_LIB_DEPENDS= libpulse.so:${PORTSDIR}/audio/pulseaudio \
diff --git a/x11/kde4-runtime/distinfo b/x11/kde4-runtime/distinfo
index d96abd1dc82..7c8ccbcb16f 100644
--- a/x11/kde4-runtime/distinfo
+++ b/x11/kde4-runtime/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.14.2/kde-runtime-4.14.2.tar.xz) = 22bcced462b785b8e50b666101ecbec04a0135656842ef5718530da621342fec
-SIZE (KDE/4.14.2/kde-runtime-4.14.2.tar.xz) = 7867216
+SHA256 (KDE/4.14.3/kde-runtime-4.14.3.tar.xz) = 78a74e519b4e897ffcee14be98eebd7b672ad2bb6e71a4aa2fe77682b5bc8605
+SIZE (KDE/4.14.3/kde-runtime-4.14.3.tar.xz) = 7867308
diff --git a/x11/kde4-runtime/files/patch-kioslave__bookmarks__kio_bookmarks.cpp b/x11/kde4-runtime/files/patch-kioslave__bookmarks__kio_bookmarks.cpp
deleted file mode 100644
index 7fb7b14a613..00000000000
--- a/x11/kde4-runtime/files/patch-kioslave__bookmarks__kio_bookmarks.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-commit d68703900edc8416fbcd2550cd336cbbb76decb9
-Author: Martin Sandsmark <martin.sandsmark@kde.org>
-Date: Thu Nov 13 13:29:01 2014 +0100
-
- Sanitize path
-
---- kioslave/bookmarks/kio_bookmarks.cpp
-+++ kioslave/bookmarks/kio_bookmarks.cpp
-@@ -22,6 +22,7 @@
- #include <stdlib.h>
-
- #include <qregexp.h>
-+#include <qtextdocument.h>
-
- #include <kapplication.h>
- #include <kcmdlineargs.h>
-@@ -197,7 +198,7 @@ void BookmarksProtocol::get( const KUrl& url )
- echoImage(regexp.cap(1), regexp.cap(2), url.queryItem("size"));
- } else {
- echoHead();
-- echo("<p class=\"message\">" + i18n("Wrong request: %1",path) + "</p>");
-+ echo("<p class=\"message\">" + i18n("Bad request: %1", Qt::escape(Qt::escape(url.prettyUrl()))) + "</p>");
- }
- finished();
- }
diff --git a/x11/kde4-runtime/files/patch-kioslave__sftp__kio_sftp.cpp b/x11/kde4-runtime/files/patch-kioslave__sftp__kio_sftp.cpp
deleted file mode 100644
index abf5f8c4a36..00000000000
--- a/x11/kde4-runtime/files/patch-kioslave__sftp__kio_sftp.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
---- kioslave/sftp/kio_sftp.cpp.orig 2014-10-27 22:00:05.195340477 +0100
-+++ kioslave/sftp/kio_sftp.cpp 2014-10-27 22:00:14.755340379 +0100
-@@ -528,7 +528,7 @@
- return false;
- }
-
-- int timeout_sec = 30, timeout_usec = 0;
-+ long int timeout_sec = 30, timeout_usec = 0;
-
- kDebug(KIO_SFTP_DB) << "Creating the SSH session and setting options";
-
diff --git a/x11/kde4-workspace/Makefile b/x11/kde4-workspace/Makefile
index 560270d6566..2f08f6d6471 100644
--- a/x11/kde4-workspace/Makefile
+++ b/x11/kde4-workspace/Makefile
@@ -2,7 +2,6 @@
PORTNAME= kde-workspace
PORTVERSION= ${KDE4_WORKSPACE_VERSION}
-PORTREVISION= 2
CATEGORIES= x11 kde
MASTER_SITES= KDE/${KDE4_BRANCH}/${KDE4_VERSION}/src
DIST_SUBDIR= KDE/${PORTVERSION}
@@ -70,7 +69,7 @@ OPTIONS_DEFINE= GLES GPS KACTIVITY UPOWER WALLPAPERS
OPTIONS_GROUP= PHONON PLASMA
OPTIONS_GROUP_PHONON= GSTREAMER VLC
OPTIONS_GROUP_PLASMA= PYTHON RUBY
-OPTIONS_DEFAULT= GLES GPS GSTREAMER KACTIVITY UPOWER WALLPAPERS
+OPTIONS_DEFAULT= GLES GPS KACTIVITY UPOWER VLC WALLPAPERS
OPTIONS_SUB= yes # GPS GLES
GLES_DESC= OpenGL ES 2.0 support in kwin and kinfocenter
@@ -83,7 +82,6 @@ GPS_CMAKE_ON= -DWITH_libgps:BOOL=ON
GPS_CMAKE_OFF= -DWITH_libgps:BOOL=OFF
GSTREAMER_DESC= Multimedia via Phonon-GStreamer
-GSTREAMER_USE= GSTREAMER=core
GSTREAMER_USE= QT4=phonon-gst_run
KACTIVITY_DESC= Activity Manager daemon
diff --git a/x11/kde4-workspace/distinfo b/x11/kde4-workspace/distinfo
index 699b3a7cf1f..aa1f5169108 100644
--- a/x11/kde4-workspace/distinfo
+++ b/x11/kde4-workspace/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.11.13/kde-workspace-4.11.13.tar.xz) = 80b916d49713e75250b2bd3358d0c0b062ba80b671311866ee1955e2f91a2201
-SIZE (KDE/4.11.13/kde-workspace-4.11.13.tar.xz) = 13536880
+SHA256 (KDE/4.11.14/kde-workspace-4.11.14.tar.xz) = cf20a562f3abf848ab0e122d6af1971dcc6383b91565f6da21f46f1011386e01
+SIZE (KDE/4.11.14/kde-workspace-4.11.14.tar.xz) = 13529808
diff --git a/x11/kde4-workspace/files/patch-CVE-2014-8651 b/x11/kde4-workspace/files/patch-CVE-2014-8651
deleted file mode 100644
index 288b8afb99f..00000000000
--- a/x11/kde4-workspace/files/patch-CVE-2014-8651
+++ /dev/null
@@ -1,113 +0,0 @@
-commit eebcb17746d9fa86ea8c5a7344709ef6750781cf
-Author: David Edmundson <kde@davidedmundson.co.uk>
-Date: Tue Nov 4 13:57:59 2014 +0100
-
- Do not pass ntpUtility as an argument to datetime helper
-
- Passing the name of a binary to run to a polkit helper is a security
- risk as it allows any arbitrary process to be executed.
-
- This patch moves the detection of ntp utility location into the helper
- function.
-
- REVIEW: 120977
-
---- kcontrol/dateandtime/dtime.cpp
-+++ kcontrol/dateandtime/dtime.cpp
-@@ -142,27 +142,15 @@ void Dtime::serverTimeCheck() {
- //kclock->setEnabled(enabled);
- }
-
--void Dtime::findNTPutility(){
-- QByteArray envpath = qgetenv("PATH");
-- if (!envpath.isEmpty() && envpath[0] == ':') {
-- envpath = envpath.mid(1);
-- }
--
-- QString path = "/sbin:/usr/sbin:";
-- if (!envpath.isEmpty()) {
-- path += QString::fromLocal8Bit(envpath);
-- } else {
-- path += QLatin1String("/bin:/usr/bin");
-- }
--
-- foreach(const QString &possible_ntputility, QStringList() << "ntpdate" << "rdate" ) {
-- if( !((ntpUtility = KStandardDirs::findExe(possible_ntputility, path)).isEmpty()) ) {
-- kDebug() << "ntpUtility = " << ntpUtility;
-- return;
-+void Dtime::findNTPutility()
-+{
-+ const QString exePath = QLatin1String("/usr/sbin:/usr/bin:/sbin:/bin");
-+ foreach(const QString &possible_ntputility, QStringList() << "ntpdate" << "rdate" ) {
-+ ntpUtility = KStandardDirs::findExe(possible_ntputility, exePath);
-+ if (!ntpUtility.isEmpty()) {
-+ return;
-+ }
- }
-- }
--
-- kDebug() << "ntpUtility not found!";
- }
-
- void Dtime::set_time()
-@@ -238,7 +226,6 @@ void Dtime::save( QVariantMap& helperargs )
- helperargs["ntp"] = true;
- helperargs["ntpServers"] = list;
- helperargs["ntpEnabled"] = setDateTimeAuto->isChecked();
-- helperargs["ntpUtility"] = ntpUtility;
-
- if(setDateTimeAuto->isChecked() && !ntpUtility.isEmpty()){
- // NTP Time setting - done in helper
---- kcontrol/dateandtime/helper.cpp
-+++ kcontrol/dateandtime/helper.cpp
-@@ -52,8 +52,18 @@
- // clears it. So we have to use a reasonable default.
- static const QString exePath = QLatin1String("/usr/sbin:/usr/bin:/sbin:/bin");
-
--int ClockHelper::ntp( const QStringList& ntpServers, bool ntpEnabled,
-- const QString& ntpUtility )
-+static QString findNtpUtility()
-+{
-+ foreach(const QString &possible_ntputility, QStringList() << "ntpdate" << "rdate" ) {
-+ const QString ntpUtility = KStandardDirs::findExe(possible_ntputility, exePath);
-+ if (!ntpUtility.isEmpty()) {
-+ return ntpUtility;
-+ }
-+ }
-+ return QString();
-+}
-+
-+int ClockHelper::ntp( const QStringList& ntpServers, bool ntpEnabled )
- {
- int ret = 0;
-
-@@ -69,6 +79,8 @@ int ClockHelper::ntp( const QStringList& ntpServers, bool ntpEnabled,
- config.writeEntry("servers", ntpServers );
- config.writeEntry("enabled", ntpEnabled );
-
-+ QString ntpUtility(findNtpUtility());
-+
- if ( ntpEnabled && !ntpUtility.isEmpty() ) {
- // NTP Time setting
- QString timeServer = ntpServers.first();
-@@ -227,7 +239,7 @@ ActionReply ClockHelper::save(const QVariantMap &args)
- int ret = 0; // error code
- // The order here is important
- if( _ntp )
-- ret |= ntp( args.value("ntpServers").toStringList(), args.value("ntpEnabled").toBool(), args.value("ntpUtility").toString() );
-+ ret |= ntp( args.value("ntpServers").toStringList(), args.value("ntpEnabled").toBool());
- if( _date )
- ret |= date( args.value("newdate").toString(), args.value("olddate").toString() );
- if( _tz )
---- kcontrol/dateandtime/helper.h
-+++ kcontrol/dateandtime/helper.h
-@@ -42,8 +42,7 @@ class ClockHelper : public QObject
- ActionReply save(const QVariantMap &map);
-
- private:
-- int ntp(const QStringList& ntpServers, bool ntpEnabled,
-- const QString& ntpUtility);
-+ int ntp(const QStringList& ntpServers, bool ntpEnabled);
- int date(const QString& newdate, const QString& olddate);
- int tz(const QString& selectedzone);
- int tzreset();
diff --git a/x11/kde4-workspace/files/patch-kinfocenter b/x11/kde4-workspace/files/patch-kinfocenter
new file mode 100644
index 00000000000..0c88b1f1864
--- /dev/null
+++ b/x11/kde4-workspace/files/patch-kinfocenter
@@ -0,0 +1,375 @@
+ Clean up info_fbsd.cpp.
+ Use libpci for pci access if possible - on FreeBSD it requires root
+ privileges (rw access to /dev/pci), therefore leave old method
+ as a fallback.
+ Improve GetInfo_ReadfromPipe function to use Qt types, pass program name
+ and its parameters as separate arguments.
+
+--- /dev/null
++++ cmake/modules/FindBSDDevinfo.cmake
+@@ -0,0 +1,15 @@
++# Find FreeBSD devinfo library
++# Once done this will define
++#
++# BSDDEVINFO_FOUND - system has devinfo
++# BSDDEVINFO_INCLUDE_DIR - devinfo include directory
++# BSDDEVINFO_LIBRARY - devinfo library
++
++find_path(BSDDEVINFO_INCLUDE_DIR devinfo.h)
++
++find_library(BSDDEVINFO_LIBRARY NAMES devinfo)
++
++include(FindPackageHandleStandardArgs)
++find_package_handle_standard_args(BSDDEVINFO DEFAULT_MSG BSDDEVINFO_LIBRARY BSDDEVINFO_INCLUDE_DIR)
++
++mark_as_advanced(BSDDEVINFO_INCLUDE_DIR BSDDEVINFO_LIBRARY)
+--- kinfocenter/Modules/base/CMakeLists.txt
++++ kinfocenter/Modules/base/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # TODO: HAVE_LIBDEVINFO_H (for Solaris 7 and later)
+ # to be set if both -ldevinfo and libdevinfo.h exist
+
+-check_include_files(devinfo.h HAVE_DEVINFO_H) # info_fbsd.cpp
++macro_optional_find_package(BSDDevinfo) # info_fbsd.cpp
++macro_bool_to_01(BSDDEVINFO_FOUND HAVE_DEVINFO_H)
+
+ configure_file (../base/config-infocenter.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-infocenter.h )
+--- kinfocenter/Modules/base/info_fbsd.cpp.orig 2014-11-06 22:36:58.000000000 +0000
++++ kinfocenter/Modules/base/info_fbsd.cpp 2015-02-20 22:40:53.380666149 +0000
+@@ -15,8 +15,6 @@
+ */
+
+ #include "config-infocenter.h" // HAVE_DEVINFO_H
+-#include <sys/types.h>
+-#include <sys/sysctl.h>
+
+ #ifdef HAVE_DEVINFO_H
+ extern "C" {
+@@ -24,13 +22,16 @@
+ }
+ #endif
+
+-#include <string.h>
++#ifdef HAVE_PCIUTILS
++#include "kpci.h"
++#endif
+
+-#include <QMap>
+ #include <QFileInfo>
+-
++#include <QStringList>
+ #include <QTextStream>
+
++#include <KGlobalSettings>
++
+ void ProcessChildren(QString name);
+
+ #ifdef HAVE_DEVINFO_H
+@@ -44,13 +45,12 @@
+
+ bool GetInfo_IRQ(QTreeWidget* tree) {
+ #ifdef HAVE_DEVINFO_H
+- /* systat lists the interrupts assigned to devices as well as how many were
+- generated. Parsing its output however is about as fun as a sandpaper
+- enema. The best idea would probably be to rip out the guts of systat.
+- Too bad it's not very well commented */
+- /* Oh neat, current now has a neat little utility called devinfo */
+ if (devinfo_init())
+- return false;
++ return false;
++
++ QStringList headers;
++ headers << i18n("IRQ") << i18n("Used By");
++ tree->setHeaderLabels(headers);
+ devinfo_foreach_rman(print_irq, tree);
+ return true;
+ #else
+@@ -60,9 +60,13 @@
+
+ bool GetInfo_DMA(QTreeWidget* tree) {
+ #ifdef HAVE_DEVINFO_H
+- /* Oh neat, current now has a neat little utility called devinfo */
+ if (devinfo_init())
+- return false;
++ return false;
++
++ QStringList headers;
++ headers << i18n("DMA-Channel") << i18n("Used By");
++ tree->setHeaderLabels(headers);
++
+ devinfo_foreach_rman(print_dma, tree);
+ return true;
+ #else
+@@ -72,9 +76,12 @@
+
+ bool GetInfo_IO_Ports(QTreeWidget* tree) {
+ #ifdef HAVE_DEVINFO_H
+- /* Oh neat, current now has a neat little utility called devinfo */
+ if (devinfo_init())
+- return false;
++ return false;
++
++ QStringList headers;
++ headers << i18n("I/O-Range") << i18n("Used By");
++ tree->setHeaderLabels(headers);
+ devinfo_foreach_rman(print_ioports, tree);
+ return true;
+ #else
+@@ -83,50 +90,28 @@
+ }
+
+ bool GetInfo_SCSI(QTreeWidget* tree) {
+- FILE *pipe;
+- QTextStream *t;
+- QString s;
+-
+ if (!QFileInfo(QLatin1String("/sbin/camcontrol")).exists()) {
+- s = i18n("SCSI subsystem could not be queried: /sbin/camcontrol could not be found");
+ QStringList list;
+- list << s;
++ list << i18n("SCSI subsystem could not be queried: /sbin/camcontrol could not be found");
+ new QTreeWidgetItem(tree, list);
+- } else if ((pipe = popen("/sbin/camcontrol devlist 2>&1", "r")) == NULL) {
+- s = i18n("SCSI subsystem could not be queried: /sbin/camcontrol could not be executed");
+- QStringList list;
+- list << s;
+- new QTreeWidgetItem(tree, list);
+- } else {
+-
+- /* This prints out a list of all the scsi devies, perhaps eventually we could
+- parse it as opposed to schlepping it into a listbox */
+-
+- t = new QTextStream(pipe, QIODevice::ReadOnly);
+-
+- while (true) {
+- s = t->readLine();
+- if (s.isEmpty() )
+- break;
+- QStringList list;
+- list << s;
+- new QTreeWidgetItem(tree, list);
+- }
+-
+- delete t;
+- pclose(pipe);
+ }
++ if (GetInfo_ReadfromPipe(tree, "/sbin/camcontrol", QStringList() << "devlist", true))
++ return true;
+
+- if (!tree->topLevelItemCount())
+- return false;
+-
+- return true;
++ return false;
+ }
+
+ bool GetInfo_PCI(QTreeWidget* tree) {
+- FILE *pipe;
+- QString s, cmd;
+- QTreeWidgetItem *olditem= NULL;
++#ifdef HAVE_PCIUTILS
++// libpci exits immediately if /dev/pci can't be open in rw mode
++ QFile pcidev("/dev/pci");
++ if (pcidev.open(QIODevice::ReadWrite)) {
++ pcidev.close();
++ if ( GetInfo_PCIUtils(tree)) {
++ return true;
++ }
++ }
++#endif //HAVE_PCIUTILS
+
+ const QStringList headers(i18nc("@title:column Column name for PCI information", "Information"));
+ tree->setHeaderLabels(headers);
+@@ -136,40 +121,11 @@
+ list << i18n("Could not find any programs with which to query your system's PCI information");
+ new QTreeWidgetItem(tree, list);
+ return true;
+- } else {
+- cmd = "/usr/sbin/pciconf -l -v 2>&1";
+- }
+-
+- // TODO: GetInfo_ReadfromPipe should be improved so that we could pass the program name and its
+- // arguments to it and remove most of the code below.
+- if ((pipe = popen(cmd.toLatin1(), "r")) == NULL) {
+- QStringList list;
+- list << i18n("PCI subsystem could not be queried: %1 could not be executed", cmd);
+- olditem = new QTreeWidgetItem(olditem, list);
+- } else {
+- /* This prints out a list of all the pci devies, perhaps eventually we could
+- parse it as opposed to schlepping it into a listbox */
+- QTextStream outputStream(pipe, QIODevice::ReadOnly);
+-
+- while (!outputStream.atEnd()) {
+- s = outputStream.readLine();
+- if (s.isEmpty() )
+- break;
+- const QStringList list(s);
+- new QTreeWidgetItem(tree, list);
+- }
+-
+- pclose(pipe);
+ }
+-
+- if (!tree->topLevelItemCount()) {
+- QString str = i18n("The PCI subsystem could not be queried, this may need root privileges.");
+- olditem = new QTreeWidgetItem(tree, olditem);
+- olditem->setText(0, str);
++ if (GetInfo_ReadfromPipe(tree, "/usr/sbin/pciconf", QStringList() << "-l" << "-v", true))
+ return true;
+- }
+
+- return true;
++ return false;
+ }
+
+ bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
+@@ -179,12 +135,7 @@
+ #ifdef HAVE_DEVINFO_H
+
+ int print_irq(struct devinfo_rman *rman, void *arg) {
+- QTreeWidget* tree = (QTreeWidget *)arg;
+ if (strcmp(rman->dm_desc, "Interrupt request lines")==0) {
+-
+- QStringList list;
+- list << rman->dm_desc;
+- new QTreeWidgetItem(tree, list);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ return 0;
+@@ -192,11 +143,7 @@
+
+ int print_dma(struct devinfo_rman *rman, void *arg)
+ {
+- QTreeWidget* tree = (QTreeWidget *)arg;
+ if (strcmp(rman->dm_desc, "DMA request lines")==0) {
+- QStringList list;
+- list << rman->dm_desc;
+- new QTreeWidgetItem(tree, list);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ return(0);
+@@ -230,29 +177,25 @@
+ int hexmode;
+
+ QTreeWidget* tree = (QTreeWidget*) arg;
++ tree->setFont(KGlobalSettings::fixedFont());
++ QStringList list;
+
+- QString s, tmp;
++ QString s;
++ QTextStream result(&s);
+
+ rman = devinfo_handle_to_rman(res->dr_rman);
+ hexmode = (rman->dm_size > 100) || (rman->dm_size == 0);
+- tmp.sprintf(hexmode ? "0x%lx" : "%lu", res->dr_start);
+- s += tmp;
+- if (res->dr_size > 1) {
+- tmp.sprintf(hexmode ? "-0x%lx" : "-%lu",
+- res->dr_start + res->dr_size - 1);
+- s += tmp;
+- }
++ if (hexmode)
++ result << showbase << hex;
++ result << res->dr_start;
++ if (res->dr_size > 1)
++ result << "-" << res->dr_start + res->dr_size - 1;
++ list << s;
+
+ dev = devinfo_handle_to_device(res->dr_device);
+- if ((dev != NULL) && (dev->dd_name[0] != 0)) {
+- tmp.sprintf(" (%s)", dev->dd_name);
+- } else {
+- tmp.sprintf(" ----");
+- }
+- s += tmp;
++ if ((dev != NULL) && (dev->dd_name[0] != 0))
++ list << QString(dev->dd_name);
+
+- QStringList list;
+- list << s;
+ new QTreeWidgetItem(tree, list);
+
+ return 0;
+--- kinfocenter/Modules/info/CMakeLists.txt
++++ kinfocenter/Modules/info/CMakeLists.txt
+@@ -13,6 +13,9 @@ set(kcm_info_PART_SRCS main.cpp info.cpp ../base/os_current.cpp )
+ kde4_add_plugin(kcm_info ${kcm_info_PART_SRCS})
+
+ target_link_libraries(kcm_info ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB})
++if(BSDDEVINFO_FOUND)
++ target_link_libraries(kcm_info ${BSDDEVINFO_LIBRARY})
++endif(BSDDEVINFO_FOUND)
+
+ install(TARGETS kcm_info DESTINATION ${PLUGIN_INSTALL_DIR} )
+
+--- kinfocenter/Modules/base/info_hpux.cpp
++++ kinfocenter/Modules/base/info_hpux.cpp
+@@ -30,6 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #include <stdlib.h>
+ #include <QFile>
+ #include <QFontMetrics>
++#include <QStringList>
+ #include <QTextStream>
+
+ # define INFO_PCI "" // Please, who know it ????
+@@ -178,14 +179,14 @@ bool GetInfo_PCI(QTreeWidget* tree) {
+ }
+
+ bool GetInfo_IO_Ports(QListView *lBox) {
+- if (GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_1, false))
++ if (GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_1, QStringList(), false))
+ return true;
+ else
+- return GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_2, false);
++ return GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_2, QStringList(), false);
+ }
+
+ bool GetInfo_SCSI(QListView *lBox) {
+- return GetInfo_ReadfromPipe(lBox, INFO_DEVICES, false);
++ return GetInfo_ReadfromPipe(lBox, INFO_DEVICES, QStringList(), false);
+ }
+ /* Parts taken from fsusage.c from the Midnight Commander (mc)
+
+--- kinfocenter/Modules/base/info_linux.cpp
++++ kinfocenter/Modules/base/info_linux.cpp
+@@ -33,6 +33,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #include <QRegExp>
+ #include <QFile>
+ #include <QHeaderView>
++#include <QStringList>
+
+ #include <klocale.h>
+ #include <kiconloader.h>
+@@ -140,9 +141,12 @@ bool GetInfo_PCI(QTreeWidget* tree) {
+ tree->setSortingEnabled(false);
+
+ /* try to get the output of the lspci package first */
+- if ((num = GetInfo_ReadfromPipe(tree, "lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/usr/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/usr/local/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree,
+- "/usr/bin/lspci -v", true)))
+- return num;
++ QStringList lspci;
++ lspci << "lspci" << "/sbin/lspci" << "/usr/sbin/lspci" << "/usr/local/sbin/lspci" << "/usr/bin/lspci";
++ QString p;
++ foreach(p, lspci)
++ if (num = GetInfo_ReadfromPipe(tree, p, QStringList() << "-v", true))
++ return num;
+
+ /* if lspci failed, read the contents of /proc/pci */
+ return GetInfo_ReadfromFile(tree, INFO_PCI, 0);
+--- kinfocenter/Modules/base/os_base.h
++++ kinfocenter/Modules/base/os_base.h
+@@ -320,12 +320,12 @@ static bool GetInfo_XServer_Generic(QTreeWidget *lBox) {
+ }
+
+ /* Helper-function to read output from an external program */
+-static int GetInfo_ReadfromPipe(QTreeWidget* tree, const char *FileName, bool WithEmptyLines = true) {
++static int GetInfo_ReadfromPipe(QTreeWidget* tree, const QString &program, const QStringList &arguments, bool WithEmptyLines = true) {
+ QProcess proc;
+ QTreeWidgetItem* olditem= NULL;
+ QString s;
+
+- proc.start(FileName, QIODevice::ReadOnly);
++ proc.start(program, arguments, QIODevice::ReadOnly);
+ if (!proc.waitForFinished()) {
+ // Process hanged or did not start
+ return 0;
diff --git a/x11/kde4-workspace/files/patch-kinfocenter__Modules__base__CMakeLists.txt b/x11/kde4-workspace/files/patch-kinfocenter__Modules__base__CMakeLists.txt
deleted file mode 100644
index b8c999de736..00000000000
--- a/x11/kde4-workspace/files/patch-kinfocenter__Modules__base__CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
---- ./kinfocenter/Modules/base/CMakeLists.txt.orig 2011-05-20 22:32:07.000000000 +0200
-+++ ./kinfocenter/Modules/base/CMakeLists.txt 2011-08-09 20:48:13.345451554 +0200
-@@ -1,6 +1,6 @@
- # TODO: HAVE_LIBDEVINFO_H (for Solaris 7 and later)
- # to be set if both -ldevinfo and libdevinfo.h exist
-
--check_include_files(devinfo.h HAVE_DEVINFO_H) # info_fbsd.cpp
-+check_include_files("sys/types.h;devinfo.h" HAVE_DEVINFO_H) # info_fbsd.cpp
-
- configure_file (../base/config-infocenter.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-infocenter.h )
diff --git a/x11/kde4-workspace/files/patch-usbview b/x11/kde4-workspace/files/patch-usbview
new file mode 100644
index 00000000000..b6da2e814a3
--- /dev/null
+++ b/x11/kde4-workspace/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.
+
+--- /dev/null
++++ 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
++++ 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} )
+
+--- /dev/null
++++ 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
++++ 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, const QVariantList &) :
+ _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(QTreeWidgetItem *item, const QMap<int, QTreeWidgetI
+ 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
++++ 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& line) {
+ } 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 &dname) {
+ 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
++++ 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
diff --git a/x11/kdelibs4/Makefile b/x11/kdelibs4/Makefile
index a480d9a9758..02327477f41 100644
--- a/x11/kdelibs4/Makefile
+++ b/x11/kdelibs4/Makefile
@@ -3,7 +3,6 @@
PORTNAME= kdelibs
PORTVERSION= ${KDE4_VERSION}
-PORTREVISION= 5
CATEGORIES= x11 kde
MASTER_SITES= KDE/${KDE4_BRANCH}/${PORTVERSION}/src
DIST_SUBDIR= KDE/${PORTVERSION}
diff --git a/x11/kdelibs4/distinfo b/x11/kdelibs4/distinfo
index 3b242de411f..52fb0948d63 100644
--- a/x11/kdelibs4/distinfo
+++ b/x11/kdelibs4/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.14.2/kdelibs-4.14.2.tar.xz) = 39745a77f019cc1280374aa5de02fbf961393d1045059aa811fc374e0afd895b
-SIZE (KDE/4.14.2/kdelibs-4.14.2.tar.xz) = 11597872
+SHA256 (KDE/4.14.3/kdelibs-4.14.3.tar.xz) = f8206da1106184ef0bd031b82701c4910b8dade331c4cdaf1cd9c6c5208cfd9e
+SIZE (KDE/4.14.3/kdelibs-4.14.3.tar.xz) = 11600500
diff --git a/x11/kdelibs4/files/patch-git_0df92439 b/x11/kdelibs4/files/patch-git_0df92439
deleted file mode 100644
index 9185f4bb609..00000000000
--- a/x11/kdelibs4/files/patch-git_0df92439
+++ /dev/null
@@ -1,355 +0,0 @@
-commit 0df92439241a76c6a67efa9485bd95c3c25d63a0
-Author: Christian Mollekopf <chrigi_1@fastmail.fm>
-Date: Thu Jan 22 15:04:16 2015 +0100
-
- KRecursiveFilterProxyModel: Fixed the model
-
- The model was not working properly and didn't include all items under
- some circumstances.
- This patch fixes the following scenarios in particular:
-
- * The change in sourceDataChanged is required to fix the shortcut condition.
- The idea is that if the parent is already part of the model (it must be if acceptRow returns true),
- we can directly invoke dataChanged on the parent, resulting in the changed index
- getting reevaluated. However, because the recursive filterAcceptsRow version was used
- the shortcut was also used when only the current index matches the filter and
- the parent index is in fact not yet in the model. In this case we failed to call
- dataChanged on the right index and thus the complete branch was never added to the model.
-
- * The change in refreshAscendantMapping is required to include indexes that were
- included by descendants. The intended way how this was supposed to work is that we
- traverse the tree upwards and find the last index that is not yet part of the model.
- We would then call dataChanged on that index causing it and its descendants to get reevaluated.
- However, acceptRow does not reflect wether an index is already in the model or not.
- Consider the following model:
-
- - A
- - B
- - C
- - D
-
- If C is included in the model by default but D not, and A & B only get included due to C, we have the following model:
-
- - A
- - B
- - C
-
- If we then call refreshAscendantsMapping on D it will not consider B as already being part of the model.
- This results in the toplevel index A being considered lastAscendant, and a call to dataChanged on A results in
- a reevaluation of A only, which is already in the model. Thus D never gets added to the model.
-
- Unfortunately there is no way to probe QSortFilterProxyModel for indexes that are
- already part of the model. Even the const mapFromSource internally creates a mapping when called,
- and thus instead of revealing indexes that are not yet part of the model, it silently
- creates a mapping (without issuing the relevant signals!).
-
- As the only possible workaround we have to issues dataChanged for all ancestors
- which is ignored for indexes that are not yet mapped, and results in a rowsInserted
- signal for the correct indexes. It also results in superfluous dataChanged signals,
- since we don't know when to stop, but at least we have a properly behaving model
- this way.
-
- REVIEW: 120119
- BUG: 338950
-
---- kdeui/itemviews/krecursivefilterproxymodel.cpp
-+++ kdeui/itemviews/krecursivefilterproxymodel.cpp
-@@ -108,12 +108,9 @@ public:
- void sourceRowsRemoved(const QModelIndex &source_parent, int start, int end);
-
- /**
-- Given that @p index does not match the filter, clear mappings in the QSortFilterProxyModel up to and excluding the
-- first ascendant that does match, and remake the mappings.
--
-- If @p refreshAll is true, this method also refreshes intermediate mappings. This is significant when removing rows.
-+ Given that @p index does not match the filter, clear mappings in the QSortFilterProxyModel up to roo, and remake the mappings.
- */
-- void refreshAscendantMapping(const QModelIndex &index, bool refreshAll = false);
-+ void refreshAscendantMapping(const QModelIndex &index);
-
- bool ignoreRemove;
- bool completeInsert;
-@@ -126,7 +123,7 @@ void KRecursiveFilterProxyModelPrivate::sourceDataChanged(const QModelIndex &sou
-
- QModelIndex source_parent = source_top_left.parent();
-
-- if (!source_parent.isValid() || q->filterAcceptsRow(source_parent.row(), source_parent.parent()))
-+ if (!source_parent.isValid() || q->acceptRow(source_parent.row(), source_parent.parent()))
- {
- invokeDataChanged(source_top_left, source_bottom_right);
- return;
-@@ -146,27 +143,20 @@ void KRecursiveFilterProxyModelPrivate::sourceDataChanged(const QModelIndex &sou
- refreshAscendantMapping(source_parent);
- }
-
--void KRecursiveFilterProxyModelPrivate::refreshAscendantMapping(const QModelIndex &index, bool refreshAll)
-+void KRecursiveFilterProxyModelPrivate::refreshAscendantMapping(const QModelIndex &index)
- {
- Q_Q(KRecursiveFilterProxyModel);
--
- Q_ASSERT(index.isValid());
-- QModelIndex lastAscendant = index;
-- QModelIndex sourceAscendant = index.parent();
-+
-+ QModelIndex sourceAscendant = index;
- // We got a matching descendant, so find the right place to insert the row.
- // We need to tell the QSortFilterProxyModel that the first child between an existing row in the model
- // has changed data so that it will get a mapping.
-- while(sourceAscendant.isValid() && !q->acceptRow(sourceAscendant.row(), sourceAscendant.parent()))
-+ while(sourceAscendant.isValid())
- {
-- if (refreshAll)
-- invokeDataChanged(sourceAscendant, sourceAscendant);
--
-- lastAscendant = sourceAscendant;
-+ invokeDataChanged(sourceAscendant, sourceAscendant);
- sourceAscendant = sourceAscendant.parent();
- }
--
-- // Inform the model that its data changed so that it creates new mappings and finds the rows which now match the filter.
-- invokeDataChanged(lastAscendant, lastAscendant);
- }
-
- void KRecursiveFilterProxyModelPrivate::sourceRowsAboutToBeInserted(const QModelIndex &source_parent, int start, int end)
-@@ -261,7 +251,7 @@ void KRecursiveFilterProxyModelPrivate::sourceRowsRemoved(const QModelIndex &sou
- // This is needed because QSFPM only invalidates the mapping for the
- // index range given to dataChanged, not its children.
- if (source_parent.isValid())
-- refreshAscendantMapping(source_parent, true);
-+ refreshAscendantMapping(source_parent);
- }
-
- KRecursiveFilterProxyModel::KRecursiveFilterProxyModel(QObject* parent)
---- kdeui/tests/CMakeLists.txt
-+++ kdeui/tests/CMakeLists.txt
-@@ -82,6 +82,7 @@ KDEUI_PROXYMODEL_TESTS(
- kdescendantsproxymodeltest
- kselectionproxymodeltest
- testmodelqueuedconnections
-+ krecursivefilterproxymodeltest
- )
-
- KDEUI_EXECUTABLE_TESTS(
---- /dev/null
-+++ kdeui/tests/krecursivefilterproxymodeltest.cpp
-@@ -0,0 +1,220 @@
-+/*
-+ Copyright (c) 2014 Christian Mollekopf <mollekopf@kolabsys.com>
-+
-+ This library is free software; you can redistribute it and/or modify it
-+ under the terms of the GNU Library General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or (at your
-+ option) any later version.
-+
-+ This library is distributed in the hope that it will be useful, but WITHOUT
-+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
-+ License for more details.
-+
-+ You should have received a copy of the GNU Library General Public License
-+ along with this library; see the file COPYING.LIB. If not, write to the
-+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+ 02110-1301, USA.
-+*/
-+
-+
-+#include <qtest_kde.h>
-+
-+#include <krecursivefilterproxymodel.h>
-+#include <QStandardItemModel>
-+
-+class ModelSignalSpy : public QObject {
-+ Q_OBJECT
-+public:
-+ explicit ModelSignalSpy(QAbstractItemModel &model) {
-+ connect(&model, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(onRowsInserted(QModelIndex,int,int)));
-+ connect(&model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(onRowsRemoved(QModelIndex,int,int)));
-+ connect(&model, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)), this, SLOT(onRowsMoved(QModelIndex,int,int, QModelIndex, int)));
-+ connect(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
-+ connect(&model, SIGNAL(layoutChanged()), this, SLOT(onLayoutChanged()));
-+ connect(&model, SIGNAL(modelReset()), this, SLOT(onModelReset()));
-+ }
-+
-+ QStringList mSignals;
-+ QModelIndex parent;
-+ int start;
-+ int end;
-+
-+public Q_SLOTS:
-+ void onRowsInserted(QModelIndex p, int s, int e) {
-+ mSignals << QLatin1String("rowsInserted");
-+ parent = p;
-+ start = s;
-+ end = e;
-+ }
-+ void onRowsRemoved(QModelIndex p, int s, int e) {
-+ mSignals << QLatin1String("rowsRemoved");
-+ parent = p;
-+ start = s;
-+ end = e;
-+ }
-+ void onRowsMoved(QModelIndex,int,int,QModelIndex,int) {
-+ mSignals << QLatin1String("rowsMoved");
-+ }
-+ void onDataChanged(QModelIndex,QModelIndex) {
-+ mSignals << QLatin1String("dataChanged");
-+ }
-+ void onLayoutChanged() {
-+ mSignals << QLatin1String("layoutChanged");
-+ }
-+ void onModelReset() {
-+ mSignals << QLatin1String("modelReset");
-+ }
-+};
-+
-+class TestModel : public KRecursiveFilterProxyModel
-+{
-+ Q_OBJECT
-+public:
-+ virtual bool acceptRow(int sourceRow, const QModelIndex &sourceParent) const
-+ {
-+ // qDebug() << sourceModel()->index(sourceRow, 0, sourceParent).data().toString() << sourceModel()->index(sourceRow, 0, sourceParent).data(Qt::UserRole+1).toBool();
-+ return sourceModel()->index(sourceRow, 0, sourceParent).data(Qt::UserRole+1).toBool();
-+ }
-+};
-+
-+static QModelIndex getIndex(const char *string, const QAbstractItemModel &model)
-+{
-+ QModelIndexList list = model.match(model.index(0, 0), Qt::DisplayRole, QString::fromLatin1(string), 1, Qt::MatchRecursive);
-+ if (list.isEmpty()) {
-+ return QModelIndex();
-+ }
-+ return list.first();
-+}
-+
-+class KRecursiveFilterProxyModelTest : public QObject
-+{
-+ Q_OBJECT
-+private:
-+
-+private slots:
-+ // Test that we properly react to a data-changed signal in a descendant and include all required rows
-+ void testDataChange()
-+ {
-+ QStandardItemModel model;
-+ TestModel proxy;
-+ proxy.setSourceModel(&model);
-+
-+ QStandardItem *index1 = new QStandardItem("1");
-+ index1->setData(false);
-+ model.appendRow(index1);
-+
-+ QVERIFY(!getIndex("1", proxy).isValid());
-+
-+ QStandardItem *index1_1_1 = new QStandardItem("1.1.1");
-+ index1_1_1->setData(false);
-+ QStandardItem *index1_1 = new QStandardItem("1.1");
-+ index1_1->setData(false);
-+ index1_1->appendRow(index1_1_1);
-+ index1->appendRow(index1_1);
-+
-+ ModelSignalSpy spy(proxy);
-+ index1_1_1->setData(true);
-+
-+ QVERIFY(getIndex("1", proxy).isValid());
-+ QVERIFY(getIndex("1.1", proxy).isValid());
-+ QVERIFY(getIndex("1.1.1", proxy).isValid());
-+
-+ QCOMPARE(spy.mSignals, QStringList() << QLatin1String("rowsInserted"));
-+ }
-+
-+ void testInsert()
-+ {
-+ QStandardItemModel model;
-+ TestModel proxy;
-+ proxy.setSourceModel(&model);
-+
-+ QStandardItem *index1 = new QStandardItem("index1");
-+ index1->setData(false);
-+ model.appendRow(index1);
-+
-+ QStandardItem *index1_1 = new QStandardItem("index1_1");
-+ index1_1->setData(false);
-+ index1->appendRow(index1_1);
-+
-+ QStandardItem *index1_1_1 = new QStandardItem("index1_1_1");
-+ index1_1_1->setData(false);
-+ index1_1->appendRow(index1_1_1);
-+
-+ QVERIFY(!getIndex("index1", proxy).isValid());
-+ QVERIFY(!getIndex("index1_1", proxy).isValid());
-+ QVERIFY(!getIndex("index1_1_1", proxy).isValid());
-+
-+ ModelSignalSpy spy(proxy);
-+ {
-+ QStandardItem *index1_1_1_1 = new QStandardItem("index1_1_1_1");
-+ index1_1_1_1->setData(true);
-+ index1_1_1->appendRow(index1_1_1_1);
-+ }
-+
-+ QVERIFY(getIndex("index1", proxy).isValid());
-+ QVERIFY(getIndex("index1_1", proxy).isValid());
-+ QVERIFY(getIndex("index1_1_1", proxy).isValid());
-+ QVERIFY(getIndex("index1_1_1_1", proxy).isValid());
-+ QCOMPARE(spy.mSignals, QStringList() << QLatin1String("rowsInserted"));
-+ QCOMPARE(spy.parent, QModelIndex());
-+ }
-+
-+
-+ // We want to get index1_1_1_1 into the model which is a descendant of index1_1.
-+ // index1_1 is already in the model from the neighbor2 branch. We must ensure dataChange is called on index1_1,
-+ // so index1_1_1_1 is included in the model.
-+ void testNeighborPath()
-+ {
-+ QStandardItemModel model;
-+ TestModel proxy;
-+ proxy.setSourceModel(&model);
-+
-+ QStandardItem *index1 = new QStandardItem("index1");
-+ index1->setData(false);
-+ model.appendRow(index1);
-+
-+ QStandardItem *index1_1 = new QStandardItem("index1_1");
-+ index1_1->setData(false);
-+ index1->appendRow(index1_1);
-+
-+ QStandardItem *index1_1_1 = new QStandardItem("index1_1_1");
-+ index1_1_1->setData(false);
-+ index1_1->appendRow(index1_1_1);
-+
-+ {
-+ QStandardItem *nb1 = new QStandardItem("neighbor");
-+ nb1->setData(false);
-+ index1_1->appendRow(nb1);
-+
-+ QStandardItem *nb2 = new QStandardItem("neighbor2");
-+ nb2->setData(true);
-+ nb1->appendRow(nb2);
-+ }
-+
-+ //These tests affect the test. It seems without them the mapping is not created in qsortfilterproxymodel, resulting in the item
-+ //simply getting added later on. With these the model didn't react to the added index1_1_1_1 as it should.
-+ QVERIFY(!getIndex("index1_1_1", proxy).isValid());
-+ QVERIFY(getIndex("index1_1", proxy).isValid());
-+ QVERIFY(getIndex("neighbor", proxy).isValid());
-+ QVERIFY(getIndex("neighbor2", proxy).isValid());
-+
-+ ModelSignalSpy spy(proxy);
-+
-+ {
-+ QStandardItem *index1_1_1_1 = new QStandardItem("index1_1_1_1");
-+ index1_1_1_1->setData(true);
-+ index1_1_1->appendRow(index1_1_1_1);
-+ }
-+
-+ QVERIFY(getIndex("index1_1_1", proxy).isValid());
-+ QVERIFY(getIndex("index1_1_1_1", proxy).isValid());
-+ //The dataChanged signals are not intentional and caused by refreshAscendantMapping. Unfortunately we can't avoid them.
-+ QCOMPARE(spy.mSignals, QStringList() << QLatin1String("rowsInserted") << QLatin1String("dataChanged") << QLatin1String("dataChanged"));
-+ }
-+
-+};
-+
-+QTEST_KDEMAIN(KRecursiveFilterProxyModelTest, NoGUI)
-+
-+#include "krecursivefilterproxymodeltest.moc"
diff --git a/x11/kgamma/distinfo b/x11/kgamma/distinfo
index 8745f24e597..19c9f8d510b 100644
--- a/x11/kgamma/distinfo
+++ b/x11/kgamma/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.14.2/kgamma-4.14.2.tar.xz) = 0a8ae535d7bf07b2c11aa462866936e2e77858f769a3045608d714152247fabb
-SIZE (KDE/4.14.2/kgamma-4.14.2.tar.xz) = 22932
+SHA256 (KDE/4.14.3/kgamma-4.14.3.tar.xz) = 93f78c56b81684152e72b6b1672814505085b372213c77f184f78fac410bf5b2
+SIZE (KDE/4.14.3/kgamma-4.14.3.tar.xz) = 22932
diff --git a/x11/konsole/distinfo b/x11/konsole/distinfo
index b2b859e020a..800440a65a1 100644
--- a/x11/konsole/distinfo
+++ b/x11/konsole/distinfo
@@ -1,2 +1,2 @@
-SHA256 (KDE/4.14.2/konsole-4.14.2.tar.xz) = e6afac385e4746438205e1b02e0001141c36aa0c032d1ef9647588ab51d386e2
-SIZE (KDE/4.14.2/konsole-4.14.2.tar.xz) = 455108
+SHA256 (KDE/4.14.3/konsole-4.14.3.tar.xz) = 2f750e6930309f8a3b939c7cd30415a08d71da27af10893c3341305db803f155
+SIZE (KDE/4.14.3/konsole-4.14.3.tar.xz) = 455216