mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 10:22:50 +00:00
generic: move plasma projects to plasma directory, new lsof applet
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
227e460780
commit
3f463fe412
22 changed files with 370 additions and 15 deletions
|
@ -31,5 +31,5 @@ macro_optional_add_subdirectory (knetpkg)
|
||||||
macro_optional_add_subdirectory (kfirewall)
|
macro_optional_add_subdirectory (kfirewall)
|
||||||
macro_optional_add_subdirectory (khash)
|
macro_optional_add_subdirectory (khash)
|
||||||
macro_optional_add_subdirectory (kprintjobs)
|
macro_optional_add_subdirectory (kprintjobs)
|
||||||
macro_optional_add_subdirectory (plasma-wallpapers)
|
macro_optional_add_subdirectory (plasma)
|
||||||
macro_optional_add_subdirectory (kdm)
|
macro_optional_add_subdirectory (kdm)
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
project(plasma-wallpapers)
|
|
||||||
|
|
||||||
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
include(FeatureSummary)
|
|
||||||
|
|
||||||
find_package(KDELibs4 4.23.0 REQUIRED)
|
|
||||||
|
|
||||||
include_directories(${KDE4_INCLUDES})
|
|
||||||
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(anipaper)
|
|
||||||
add_subdirectory(xwallpaper)
|
|
|
@ -9,4 +9,6 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
|
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(sleeper)
|
add_subdirectory(applets)
|
||||||
|
add_subdirectory(runners)
|
||||||
|
add_subdirectory(wallpapers)
|
3
plasma/applets/CMakeLists.txt
Normal file
3
plasma/applets/CMakeLists.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
project(plasma-applets)
|
||||||
|
|
||||||
|
add_subdirectory(lsof)
|
22
plasma/applets/lsof/CMakeLists.txt
Normal file
22
plasma/applets/lsof/CMakeLists.txt
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
project(plasma-lsof)
|
||||||
|
|
||||||
|
set(lsof_SRCS
|
||||||
|
lsof.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
kde4_add_plugin(plasma_applet_lsof ${lsof_SRCS})
|
||||||
|
target_link_libraries(plasma_applet_lsof
|
||||||
|
KDE4::plasma
|
||||||
|
KDE4::solid
|
||||||
|
ksgrd
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS plasma_applet_lsof
|
||||||
|
DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES plasma-applet-lsof.desktop
|
||||||
|
DESTINATION ${KDE4_SERVICES_INSTALL_DIR}
|
||||||
|
)
|
272
plasma/applets/lsof/lsof.cpp
Normal file
272
plasma/applets/lsof/lsof.cpp
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
/*
|
||||||
|
This file is part of the KDE project
|
||||||
|
Copyright (C) 2024 Ivailo Monev <xakepa10@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
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 "lsof.h"
|
||||||
|
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QGraphicsLinearLayout>
|
||||||
|
#include <Plasma/TreeWidget>
|
||||||
|
#include <KStandardDirs>
|
||||||
|
#include <KIcon>
|
||||||
|
#include <KDebug>
|
||||||
|
|
||||||
|
// TODO: option for it
|
||||||
|
static const int s_updatetimeout = 2000; // ms
|
||||||
|
static const QStringList s_lsofargs = QStringList() << QLatin1String("-Fftn");
|
||||||
|
// keeps things interactive, somewhat
|
||||||
|
static const int s_processtime = 50;
|
||||||
|
|
||||||
|
class LsofData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LsofData();
|
||||||
|
|
||||||
|
QByteArray lsoffd;
|
||||||
|
QByteArray lsoftype;
|
||||||
|
QByteArray lsofpid;
|
||||||
|
QByteArray lsofname;
|
||||||
|
QTreeWidgetItem* lsofitem;
|
||||||
|
|
||||||
|
bool operator==(const LsofData &other) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
LsofData::LsofData()
|
||||||
|
: lsofitem(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LsofData::operator==(const LsofData &other) const
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
lsoffd == other.lsoffd && lsoftype == other.lsoftype
|
||||||
|
&& lsofpid == other.lsofpid && lsofname == other.lsofname
|
||||||
|
&& lsofitem == other.lsofitem
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class LsofWidget : public QGraphicsWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
LsofWidget(Lsof* lsof);
|
||||||
|
~LsofWidget();
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void slotUpdateLayout();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void slotFinished(int exitcode);
|
||||||
|
void slotTimeout();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QMutex m_mutex;
|
||||||
|
Lsof* m_lsof;
|
||||||
|
QGraphicsLinearLayout* m_layout;
|
||||||
|
Plasma::TreeWidget* m_treewidget;
|
||||||
|
QTreeWidget* m_treewidgetnative;
|
||||||
|
QProcess* m_lsofproc;
|
||||||
|
QTimer* m_timer;
|
||||||
|
QString m_lsofexe;
|
||||||
|
QList<LsofData> m_lsofdata;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
LsofWidget::LsofWidget(Lsof* lsof)
|
||||||
|
: QGraphicsWidget(lsof),
|
||||||
|
m_lsof(lsof),
|
||||||
|
m_layout(nullptr),
|
||||||
|
m_treewidget(nullptr),
|
||||||
|
m_treewidgetnative(nullptr),
|
||||||
|
m_lsofproc(nullptr)
|
||||||
|
{
|
||||||
|
m_layout = new QGraphicsLinearLayout(this);
|
||||||
|
|
||||||
|
const QStringList treeheaders = QStringList()
|
||||||
|
<< i18n("File Descriptor")
|
||||||
|
<< i18n("Type")
|
||||||
|
<< i18n("PID")
|
||||||
|
<< i18n("Name");
|
||||||
|
m_treewidget = new Plasma::TreeWidget(this);
|
||||||
|
m_treewidgetnative = m_treewidget->nativeWidget();
|
||||||
|
m_treewidgetnative->setHeaderLabels(treeheaders);
|
||||||
|
m_treewidgetnative->setRootIsDecorated(false);
|
||||||
|
m_treewidgetnative->header()->setMovable(false);
|
||||||
|
m_treewidgetnative->header()->setStretchLastSection(true);
|
||||||
|
m_treewidgetnative->header()->setResizeMode(0, QHeaderView::ResizeToContents);
|
||||||
|
m_treewidgetnative->header()->setResizeMode(1, QHeaderView::ResizeToContents);
|
||||||
|
m_treewidgetnative->header()->setResizeMode(2, QHeaderView::ResizeToContents);
|
||||||
|
m_treewidgetnative->header()->setResizeMode(3, QHeaderView::Stretch);
|
||||||
|
m_layout->addItem(m_treewidget);
|
||||||
|
|
||||||
|
setLayout(m_layout);
|
||||||
|
|
||||||
|
m_lsofproc = new QProcess(this);
|
||||||
|
connect(m_lsofproc, SIGNAL(finished(int)), this, SLOT(slotFinished(int)));
|
||||||
|
|
||||||
|
m_timer = new QTimer(this);
|
||||||
|
m_timer->setInterval(s_updatetimeout);
|
||||||
|
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
|
||||||
|
}
|
||||||
|
|
||||||
|
LsofWidget::~LsofWidget()
|
||||||
|
{
|
||||||
|
m_timer->stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LsofWidget::slotUpdateLayout()
|
||||||
|
{
|
||||||
|
m_timer->stop();
|
||||||
|
m_treewidgetnative->clear();
|
||||||
|
m_lsofexe = KStandardDirs::findExe("lsof");
|
||||||
|
if (m_lsofexe.isEmpty()) {
|
||||||
|
m_lsof->showMessage(
|
||||||
|
KIcon("dialog-warning"),
|
||||||
|
i18n("Could not find lsof program"),
|
||||||
|
Plasma::ButtonOk
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_timer->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LsofWidget::slotFinished(int exitcode)
|
||||||
|
{
|
||||||
|
kDebug() << "lsof finished" << exitcode;
|
||||||
|
m_timer->stop();
|
||||||
|
int lsofcounter = 0;
|
||||||
|
LsofData lsofdata;
|
||||||
|
QList<LsofData> currentlsofdata;
|
||||||
|
QByteArray lsofline = m_lsofproc->readLine();
|
||||||
|
while (!lsofline.isEmpty()) {
|
||||||
|
// qDebug() << Q_FUNC_INFO << lsofline;
|
||||||
|
const char lsoflinetype = lsofline.at(0);
|
||||||
|
switch (lsoflinetype) {
|
||||||
|
case 'f': {
|
||||||
|
lsofdata.lsoffd = lsofline.mid(1, lsofline.size() - 1);
|
||||||
|
lsofcounter++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 't': {
|
||||||
|
lsofdata.lsoftype = lsofline.mid(1, lsofline.size() - 1);
|
||||||
|
lsofcounter++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'p': {
|
||||||
|
lsofdata.lsofpid = lsofline.mid(1, lsofline.size() - 1);
|
||||||
|
lsofcounter++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'n': {
|
||||||
|
lsofdata.lsofname = lsofline.mid(1, lsofline.size() - 1);
|
||||||
|
lsofcounter++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
kWarning() << "invalid lsof line" << lsofline;
|
||||||
|
lsofcounter = 0;
|
||||||
|
lsofdata.lsoffd.clear();
|
||||||
|
lsofdata.lsoftype.clear();
|
||||||
|
lsofdata.lsofpid.clear();
|
||||||
|
lsofdata.lsofname.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lsofcounter >= 4) {
|
||||||
|
currentlsofdata.append(lsofdata);
|
||||||
|
}
|
||||||
|
QApplication::processEvents(QEventLoop::AllEvents, s_processtime);
|
||||||
|
lsofline = m_lsofproc->readLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
QMutableListIterator<LsofData> iter(m_lsofdata);
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
const LsofData itercurrent = iter.next();
|
||||||
|
if (currentlsofdata.contains(itercurrent)) {
|
||||||
|
currentlsofdata.removeOne(itercurrent);
|
||||||
|
QApplication::processEvents(QEventLoop::AllEvents, s_processtime);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
iter.remove();
|
||||||
|
delete itercurrent.lsofitem;
|
||||||
|
QApplication::processEvents(QEventLoop::AllEvents, s_processtime);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const LsofData lsofdata, currentlsofdata) {
|
||||||
|
const QStringList lsofitemstrings = QStringList()
|
||||||
|
<< QString::fromLatin1(lsofdata.lsoffd.constData(), lsofdata.lsoffd.size())
|
||||||
|
<< QString::fromLatin1(lsofdata.lsoftype.constData(), lsofdata.lsoftype.size())
|
||||||
|
<< QString::fromLatin1(lsofdata.lsofpid.constData(), lsofdata.lsofpid.size())
|
||||||
|
<< QString::fromLatin1(lsofdata.lsofname.constData(), lsofdata.lsofname.size());
|
||||||
|
QTreeWidgetItem* lsofitem = new QTreeWidgetItem(m_treewidgetnative, lsofitemstrings);
|
||||||
|
lsofitem->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
lsofitem->setTextAlignment(1, Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
lsofitem->setTextAlignment(2, Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
lsofitem->setTextAlignment(3, Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
lsofitem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
||||||
|
m_treewidgetnative->addTopLevelItem(lsofitem);
|
||||||
|
QApplication::processEvents(QEventLoop::AllEvents, s_processtime);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lsofdata = currentlsofdata;
|
||||||
|
m_timer->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LsofWidget::slotTimeout()
|
||||||
|
{
|
||||||
|
m_lsofproc->terminate();
|
||||||
|
m_lsofproc->start(m_lsofexe, s_lsofargs);
|
||||||
|
}
|
||||||
|
|
||||||
|
Lsof::Lsof(QObject *parent, const QVariantList &args)
|
||||||
|
: Plasma::PopupApplet(parent, args),
|
||||||
|
m_lsofwidget(nullptr)
|
||||||
|
{
|
||||||
|
setAspectRatioMode(Plasma::IgnoreAspectRatio);
|
||||||
|
setPopupIcon("media-playlist-repeat");
|
||||||
|
// NOTE: no check has to be done if it is installed
|
||||||
|
setAssociatedApplication("ksysguard");
|
||||||
|
adjustSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
Lsof::~Lsof()
|
||||||
|
{
|
||||||
|
delete m_lsofwidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lsof::init()
|
||||||
|
{
|
||||||
|
Plasma::PopupApplet::init();
|
||||||
|
m_lsofwidget = new LsofWidget(this);
|
||||||
|
QTimer::singleShot(500, m_lsofwidget, SLOT(slotUpdateLayout()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QGraphicsWidget *Lsof::graphicsWidget()
|
||||||
|
{
|
||||||
|
return m_lsofwidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
K_EXPORT_PLASMA_APPLET(lsof, Lsof)
|
||||||
|
|
||||||
|
#include "moc_lsof.cpp"
|
||||||
|
#include "lsof.moc"
|
45
plasma/applets/lsof/lsof.h
Normal file
45
plasma/applets/lsof/lsof.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
This file is part of the KDE project
|
||||||
|
Copyright (C) 2024 Ivailo Monev <xakepa10@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LSOF_H
|
||||||
|
#define LSOF_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <Plasma/PopupApplet>
|
||||||
|
|
||||||
|
class LsofWidget;
|
||||||
|
|
||||||
|
class Lsof : public Plasma::PopupApplet
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Lsof(QObject *parent, const QVariantList &args);
|
||||||
|
~Lsof();
|
||||||
|
|
||||||
|
// Plasma::Applet reimplementations
|
||||||
|
void init() final;
|
||||||
|
// Plasma::PopupApplet reimplementation
|
||||||
|
QGraphicsWidget* graphicsWidget() final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend LsofWidget;
|
||||||
|
LsofWidget *m_lsofwidget;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LSOF_H
|
17
plasma/applets/lsof/plasma-applet-lsof.desktop
Normal file
17
plasma/applets/lsof/plasma-applet-lsof.desktop
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Open Files
|
||||||
|
Comment=List of open files
|
||||||
|
Type=Service
|
||||||
|
Icon=media-playlist-repeat
|
||||||
|
ServiceTypes=Plasma/Applet
|
||||||
|
|
||||||
|
X-KDE-Library=plasma_applet_lsof
|
||||||
|
X-KDE-PluginInfo-Author=Ivailo Monev
|
||||||
|
X-KDE-PluginInfo-Email=xakepa10@gmail.com
|
||||||
|
X-KDE-PluginInfo-Name=lsof_applet
|
||||||
|
X-KDE-PluginInfo-Version=1.0
|
||||||
|
X-KDE-PluginInfo-Website=
|
||||||
|
X-KDE-PluginInfo-Category=System Information
|
||||||
|
X-KDE-PluginInfo-Depends=
|
||||||
|
X-KDE-PluginInfo-License=GPL
|
||||||
|
X-KDE-PluginInfo-EnabledByDefault=true
|
3
plasma/runners/CMakeLists.txt
Normal file
3
plasma/runners/CMakeLists.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
project(plasma-runners)
|
||||||
|
|
||||||
|
add_subdirectory(sleeper)
|
4
plasma/wallpapers/CMakeLists.txt
Normal file
4
plasma/wallpapers/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
project(plasma-wallpapers)
|
||||||
|
|
||||||
|
add_subdirectory(anipaper)
|
||||||
|
add_subdirectory(xwallpaper)
|
Loading…
Add table
Reference in a new issue