summaryrefslogtreecommitdiffstats
path: root/kicker/applets/naughty/NaughtyApplet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kicker/applets/naughty/NaughtyApplet.cpp')
-rw-r--r--kicker/applets/naughty/NaughtyApplet.cpp223
1 files changed, 223 insertions, 0 deletions
diff --git a/kicker/applets/naughty/NaughtyApplet.cpp b/kicker/applets/naughty/NaughtyApplet.cpp
new file mode 100644
index 000000000..c256aa36f
--- /dev/null
+++ b/kicker/applets/naughty/NaughtyApplet.cpp
@@ -0,0 +1,223 @@
+/*
+ Naughty applet - Runaway process monitor for the KDE panel
+
+ Copyright 2000 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "NaughtyApplet.h"
+#include "NaughtyProcessMonitor.h"
+#include "NaughtyConfigDialog.h"
+
+#include <qmessagebox.h>
+#include <qtoolbutton.h>
+#include <qlayout.h>
+
+#include <kiconloader.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kaboutapplication.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kmessagebox.h>
+#include <qpushbutton.h>
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget * parent, const QString & configFile)
+ {
+ KGlobal::locale()->insertCatalogue("naughtyapplet");
+
+ return new NaughtyApplet
+ (
+ configFile,
+ KPanelApplet::Normal,
+ KPanelApplet::About | KPanelApplet::Preferences,
+ parent,
+ "naughtyapplet"
+ );
+ }
+}
+
+NaughtyApplet::NaughtyApplet
+(
+ const QString & configFile,
+ Type t,
+ int actions,
+ QWidget * parent,
+ const char * name
+)
+ : KPanelApplet(configFile, t, actions, parent, name)
+{
+ KGlobal::iconLoader()->addAppDir("naughtyapplet");
+ setBackgroundOrigin( AncestorOrigin );
+
+ button_ = new SimpleButton(this);
+ button_->setFixedSize(20, 20);
+
+ QVBoxLayout * layout = new QVBoxLayout(this);
+ layout->addWidget(button_);
+
+ monitor_ = new NaughtyProcessMonitor(2, 20, this);
+
+ connect
+ (
+ button_, SIGNAL(clicked()),
+ this, SLOT(slotPreferences())
+ );
+
+ connect
+ (
+ monitor_, SIGNAL(runawayProcess(ulong, const QString &)),
+ this, SLOT(slotWarn(ulong, const QString &))
+ );
+
+ connect
+ (
+ monitor_, SIGNAL(load(uint)),
+ this, SLOT(slotLoad(uint))
+ );
+
+ loadSettings();
+
+ monitor_->start();
+}
+
+NaughtyApplet::~NaughtyApplet()
+{
+ KGlobal::locale()->removeCatalogue("naughtyapplet");
+}
+
+ void
+NaughtyApplet::slotWarn(ulong pid, const QString & name)
+{
+ if (ignoreList_.contains(name))
+ return;
+
+ QString s = i18n("A program called '%1' is slowing down the others "
+ "on your machine. It may have a bug that is causing "
+ "this, or it may just be busy.\n"
+ "Would you like to try to stop the program?");
+
+ int retval = KMessageBox::warningYesNo(this, s.arg(name), QString::null, i18n("Stop"), i18n("Keep Running"));
+
+ if (KMessageBox::Yes == retval)
+ monitor_->kill(pid);
+ else
+ {
+ s = i18n("In future, should busy programs called '%1' be ignored?");
+
+ retval = KMessageBox::questionYesNo(this, s.arg(name), QString::null, i18n("Ignore"), i18n("Do Not Ignore"));
+
+ if (KMessageBox::Yes == retval)
+ {
+ ignoreList_.append(name);
+ config()->writeEntry("IgnoreList", ignoreList_);
+ config()->sync();
+ }
+ }
+}
+
+ int
+NaughtyApplet::widthForHeight(int) const
+{
+ return 20;
+}
+
+ int
+NaughtyApplet::heightForWidth(int) const
+{
+ return 20;
+}
+
+ void
+NaughtyApplet::slotLoad(uint l)
+{
+ if (l > monitor_->triggerLevel())
+ button_->setPixmap(BarIcon("naughty-sad"));
+ else
+ button_->setPixmap(BarIcon("naughty-happy"));
+}
+
+ void
+NaughtyApplet::about()
+{
+ KAboutData about
+ (
+ "naughtyapplet",
+ I18N_NOOP("Naughty applet"),
+ "1.0",
+ I18N_NOOP("Runaway process catcher"),
+ KAboutData::License_GPL_V2,
+ "(C) 2000 Rik Hemsley (rikkus) <rik@kde.org>"
+ );
+
+ KAboutApplication a(&about, this);
+ a.exec();
+}
+
+ void
+NaughtyApplet::slotPreferences()
+{
+ preferences();
+}
+
+ void
+NaughtyApplet::preferences()
+{
+ NaughtyConfigDialog d
+ (
+ ignoreList_,
+ monitor_->interval(),
+ monitor_->triggerLevel(),
+ this
+ );
+
+ QDialog::DialogCode retval = QDialog::DialogCode(d.exec());
+
+ if (QDialog::Accepted == retval)
+ {
+ ignoreList_ = d.ignoreList();
+ monitor_->setInterval(d.updateInterval());
+ monitor_->setTriggerLevel(d.threshold());
+ saveSettings();
+ }
+}
+
+ void
+NaughtyApplet::loadSettings()
+{
+ ignoreList_ = config()->readListEntry("IgnoreList");
+ monitor_->setInterval(config()->readUnsignedNumEntry("UpdateInterval", 2));
+ monitor_->setTriggerLevel(config()->readUnsignedNumEntry("Threshold", 20));
+
+ // Add 'X' as a default.
+ if (ignoreList_.isEmpty() && !config()->hasKey("IgnoreList"))
+ ignoreList_.append("X");
+}
+
+ void
+NaughtyApplet::saveSettings()
+{
+ config()->writeEntry("IgnoreList", ignoreList_);
+ config()->writeEntry("UpdateInterval", monitor_->interval());
+ config()->writeEntry("Threshold", monitor_->triggerLevel());
+ config()->sync();
+}
+
+#include "NaughtyApplet.moc"
+