summaryrefslogtreecommitdiffstats
path: root/kicker-applets/ktimemon/timemon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kicker-applets/ktimemon/timemon.cpp')
-rw-r--r--kicker-applets/ktimemon/timemon.cpp435
1 files changed, 435 insertions, 0 deletions
diff --git a/kicker-applets/ktimemon/timemon.cpp b/kicker-applets/ktimemon/timemon.cpp
new file mode 100644
index 0000000..7984cf2
--- /dev/null
+++ b/kicker-applets/ktimemon/timemon.cpp
@@ -0,0 +1,435 @@
+
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/* maintained by Dirk A. Mueller <[email protected]> */
+/**********************************************************************/
+
+/*
+ * timemon.h
+ *
+ * Definitions for the timemon widget.
+ */
+
+#include <config.h>
+
+#include <tqpainter.h>
+#include <tqtimer.h>
+#include <tqtooltip.h>
+
+#include <tdeconfig.h>
+#include <tdeglobal.h>
+#include <tdelocale.h>
+#include <khelpmenu.h>
+#include <tdepopupmenu.h>
+#include <kprocess.h>
+#include <tdemessagebox.h>
+#include <kdebug.h>
+
+#include "timemon.h"
+#include "confdlg.h"
+#include "sample.h"
+
+#include "timemon.moc"
+#include <stdio.h>
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(TQWidget *parent, const TQString& configFile)
+ {
+ TDEGlobal::locale()->insertCatalogue("ktimemon");
+ KTimeMon *mon = new KTimeMon(configFile, KPanelApplet::Normal,
+ KPanelApplet::Preferences, parent, "ktimemon");
+ return mon;
+ }
+}
+
+// Update colour settings with the new ones from the config dialog.
+void KTimeMon::updateConfig(KConfDialog *d)
+{
+ kernelColour = d->getKernelColour();
+ userColour = d->getUserColour();
+ iowaitColour = d->getIOWaitColour();
+ niceColour = d->getNiceColour();
+ cachedColour = d->getCachedColour();
+ usedColour = d->getUsedColour();
+ buffersColour = d->getBuffersColour();
+ mkernelColour = d->getMKernelColour();
+ swapColour = d->getSwapColour();
+ bgColour = d->getBgColour();
+}
+
+// -----------------------------------------------------------------------------
+// some KPanelApplet API functions
+
+int KTimeMon::widthForHeight(int height) const
+{
+ int s = (int) (vertical ? 2/3.*height : height);
+ return s>=18? s : 18;
+}
+
+
+int KTimeMon::heightForWidth(int width) const
+{
+ int s = (int) (vertical ? width : 2/3.*width);
+ return s>=18? s : 18;
+}
+
+void KTimeMon::preferences()
+{
+ configure();
+}
+
+
+// -----------------------------------------------------------------------------
+// Repaint the object; get the current sample and paint the bar graphs
+// correspondingly. Use a pixmap to minimise flicker.
+
+void KTimeMon::paintEvent(TQPaintEvent *)
+{
+ int w, h, x, y, b, r;
+
+ w = vertical ? width() : height();
+ h = vertical ? height() : width();
+
+ r = w; // remaining height
+
+ x = 0;
+
+ KSample::Sample s;
+
+ if (sample != 0)
+ s = sample->getSample(h);
+ else
+ s.fill(h);
+
+ TQPixmap pixmap(width(), height());
+ pixmap.fill(this, 0, 0);
+
+ TQPainter painter(&pixmap);
+
+ b = r / 3; // bar width
+ r -= b;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.kernel; paintRect(x, y, b, s.kernel, kernelColour, &painter);
+ y -= s.iowait; paintRect(x, y, b, s.iowait, iowaitColour, &painter);
+ y -= s.user; paintRect(x, y, b, s.user, userColour, &painter);
+ y -= s.nice; paintRect(x, y, b, s.nice, niceColour, &painter);
+
+ x += b;
+ b = r / 2;
+ r -= b;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.mkernel; paintRect(x, y, b, s.mkernel, mkernelColour, &painter);
+ y -= s.used; paintRect(x, y, b, s.used, usedColour, &painter);
+ y -= s.buffers; paintRect(x, y, b, s.buffers, buffersColour, &painter);
+ y -= s.cached; paintRect(x, y, b, s.cached, cachedColour, &painter);
+
+ x += b;
+ b = r;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.sused; paintRect(x, y, b, s.sused, swapColour, &painter);
+ painter.end();
+
+ bitBlt(this, 0, 0, &pixmap);
+}
+
+// -----------------------------------------------------------------------------
+// Draw part of a bar, depending on the bar orientation.
+
+void KTimeMon::paintRect(int x, int y, int w, int h, TQColor c, TQPainter *p)
+{
+ if (vertical)
+ p->fillRect(x, y, w, h, c);
+ else
+ p->fillRect(width() - y - h, x, h, w, c);
+}
+
+// Show a tool-tip with some status information.
+void KTimeMon::maybeTip(const TQPoint& p)
+{
+ if (sample == 0) return; // no associated sample...
+ if(!TQT_TQRECT_OBJECT(rect()).contains(p)) return;
+
+ KSample::Sample s = sample->getSample(100); // scale to 100(%)
+ int idle = 100 - s.kernel - s.user - s.nice;
+ if ( idle < 0 )
+ idle = 0;
+ TQString str = i18n("cpu: %1% idle\nmem: %2 MB %3% free\nswap: %4 MB %5% free")
+ .arg(idle)
+ .arg(TDEGlobal::locale()->formatNumber(s.used/100.*s.mtotal, 0))
+ .arg(100-s.used)
+ .arg(TDEGlobal::locale()->formatNumber(s.stotal, 0))
+ .arg(100-s.sused);
+
+ tip(rect(), str);
+}
+
+// -- KTimeMon definition ------------------------------------------------
+
+// Initialise the member variables, read the configuration data base,
+// set up the widget, and start the timer.
+KTimeMon::KTimeMon(const TQString& configFile, Type type, int actions,
+ TQWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name, WRepaintNoErase), TQToolTip(this),
+ configDialog(0), bgProcess(0),
+ kernelColour("red1"), userColour("blue"),
+ niceColour("yellow"), iowaitColour("darkgreen"),
+ usedColour("blue1"), buffersColour("yellow"),
+ cachedColour("darkgreen"), mkernelColour("red1"),
+ swapColour("cyan3"), bgColour(colorGroup().background())
+{
+ mouseAction[0] = NOTHING;
+ mouseAction[1] = NOTHING;
+ mouseAction[2] = MENU;
+
+ TDEConfig* conf = config();
+ conf->setGroup("Parameters");
+ interval = conf->readUnsignedNumEntry("Interval", 500);
+ autoScale = conf->readBoolEntry("AutoScale", true);
+
+ pageScale = conf->readUnsignedNumEntry("PageScale", 10);
+ swapScale = conf->readUnsignedNumEntry("SwapScale", 5);
+ ctxScale = conf->readUnsignedNumEntry("ContextScale", 300);
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ TQString n;
+ n.setNum(i);
+
+ mouseAction[i] = (MouseAction)
+ conf->readUnsignedNumEntry(TQString("MouseAction")+n, mouseAction[i]);
+ mouseActionCommand[i] = conf->readPathEntry(TQString("MouseActionCommand")+n);
+ }
+
+ conf->setGroup("Interface");
+ kernelColour = conf->readColorEntry("KernelColour", &kernelColour);
+ userColour = conf->readColorEntry("UserColour", &userColour);
+ niceColour = conf->readColorEntry("NiceColour", &niceColour);
+ iowaitColour = conf->readColorEntry("IOWaitColour", &iowaitColour);
+ cachedColour = conf->readColorEntry("CachedColour", &cachedColour);
+ usedColour = conf->readColorEntry("UsedColour", &usedColour);
+ buffersColour = conf->readColorEntry("BuffersColour", &buffersColour);
+ swapColour = conf->readColorEntry("SwapColour", &swapColour);
+ mkernelColour = conf->readColorEntry("MKernelColour", &mkernelColour);
+ bgColour = conf->readColorEntry("BgColour", &bgColour);
+
+ vertical = conf->readBoolEntry("Vertical", true);
+
+ timer = new TQTimer(this);
+ connect(timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(timeout()));
+ timer->start(interval);
+
+ sample = new KSample(this, autoScale, pageScale, swapScale, ctxScale);
+
+ TQString aboutmsg = i18n("KTimeMon for TDE\n"
+ "Maintained by Dirk A. Mueller <[email protected]>\n"
+ "Written by M. Maierhofer ([email protected])\n"
+ "Based on timemon by H. Maierhofer");
+
+ hmenu = new KHelpMenu(this, aboutmsg);
+ menu = new TDEPopupMenu(this);
+
+ menu->insertTitle( SmallIcon( "ktimemon" ), i18n( "System Monitor" ) ) ;
+ menu->insertItem(i18n("Horizontal Bars"), 4);
+ menu->insertItem(SmallIcon( "configure" ), i18n( "Preferences..." ), 2);
+ menu->insertSeparator();
+ menu->insertItem(SmallIcon( "help" ), i18n("Help"), hmenu->menu(), 1);
+
+ menu->connectItem(2, this, TQT_SLOT(configure()));
+ menu->connectItem(4, this, TQT_SLOT(orientation()));
+
+ menu->setCheckable(true);
+
+ vertical = !vertical; // and similar for orientation
+ orientation();
+}
+
+// -----------------------------------------------------------------------------
+
+// delete the member variables
+KTimeMon::~KTimeMon()
+{
+ delete sample;
+ delete bgProcess;
+ TDEGlobal::locale()->removeCatalogue("ktimemon");
+}
+
+
+// Apply the settings from the configuration dialog and save them.
+void KTimeMon::apply()
+{
+ stop();
+ interval = configDialog->getInterval();
+ cont();
+
+ updateConfig(configDialog);
+
+ sample->setScaling(configDialog->getAutoScale(),
+ configDialog->getPageScale(),
+ configDialog->getSwapScale(),
+ configDialog->getCtxScale());
+
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ mouseAction[i] = (MouseAction) configDialog->getMouseAction(i);
+ mouseActionCommand[i] = configDialog->getMouseActionCommand(i);
+ }
+
+ update();
+ writeConfiguration();
+}
+
+void KTimeMon::stop()
+{
+ timer->stop();
+}
+
+void KTimeMon::cont()
+{
+ timer->start(interval);
+}
+
+// Dump the current configuration entries to the data base.
+void KTimeMon::writeConfiguration()
+{
+ TDEConfig* conf = config();
+ conf->setGroup("Interface");
+ conf->writeEntry("KernelColour", kernelColour);
+ conf->writeEntry("UserColour", userColour);
+ conf->writeEntry("NiceColour", niceColour);
+ conf->writeEntry("IOWaitColour", iowaitColour);
+ conf->writeEntry("CachedColour", cachedColour);
+ conf->writeEntry("UsedColour", usedColour);
+ conf->writeEntry("BuffersColour", buffersColour);
+ conf->writeEntry("MKernelColour", mkernelColour);
+ conf->writeEntry("SwapColour", swapColour);
+ conf->writeEntry("BgColour", bgColour);
+ conf->writeEntry("Mode", true);
+ conf->writeEntry("Vertical", vertical);
+
+ conf->setGroup("Parameters");
+ conf->writeEntry("Interval", interval);
+ conf->writeEntry("AutoScale", autoScale);
+ conf->writeEntry("PageScale", pageScale);
+ conf->writeEntry("SwapScale", swapScale);
+ conf->writeEntry("ContextScale", ctxScale);
+ conf->writeEntry("WidgetSize", size());
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ TQString n;
+ n.setNum(i);
+
+ conf->writeEntry(TQString("MouseAction")+n, (unsigned)mouseAction[i]);
+ conf->writePathEntry(TQString("MouseActionCommand")+n, mouseActionCommand[i]);
+ }
+ conf->sync();
+}
+
+// Make the KSample object update its internal sample and repaint the
+// object.
+void KTimeMon::timeout()
+{
+ sample->updateSample();
+ update();
+}
+
+// This is called when the session management strikes, and also when the
+// main program exits with a code of 0 (i.e. there was no error).
+void KTimeMon::save()
+{
+ writeConfiguration();
+}
+
+// -----------------------------------------------------------------------------
+// Update the configuration dialog with the current values and show it.
+
+void KTimeMon::configure()
+{
+ if (configDialog == 0) configDialog = new KConfDialog(this);
+ configDialog->update();
+ configDialog->show();
+}
+
+// -----------------------------------------------------------------------------
+// Change the orientation of the status bars
+
+void KTimeMon::orientation()
+{
+ vertical = !vertical;
+
+ TDEConfig* conf = config();
+ conf->setGroup("Interface");
+ conf->writeEntry("Vertical", vertical);
+
+ menu->setItemChecked(4, !vertical);
+
+ update();
+ emit updateLayout();
+}
+
+// Pop up the menu when the appropriate button has been pressed.
+void KTimeMon::mousePressEvent(TQMouseEvent *event)
+{
+ if (event == 0) return;
+
+ int index = -1;
+ if (event->button() == Qt::LeftButton) index = 0;
+ else if (event->button() == Qt::MidButton) index = 1;
+ else if (event->button() == Qt::RightButton) index = 2;
+
+ if (index == -1) return;
+
+ switch (mouseAction[index]) {
+ case NOTHING:
+ break;
+ case SWITCH:
+ break;
+ case MENU:
+ menu->popup(mapToGlobal(event->pos()));
+ break;
+ case COMMAND:
+ runCommand(index);
+ break;
+ }
+}
+
+// Start the given command
+void KTimeMon::runCommand(int index)
+{
+ // just in case it still hangs around
+ delete bgProcess;
+
+ bgProcess = new KShellProcess;
+ *bgProcess << mouseActionCommand[index];
+ connect(bgProcess, TQT_SIGNAL(receivedStderr(TDEProcess *, char *, int)),
+ this, TQT_SLOT(commandStderr(TDEProcess *, char *, int)));
+ bgProcess->start(TDEProcess::DontCare, TDEProcess::Stderr);
+}
+
+// -----------------------------------------------------------------------------
+// Check if there is any diagnostic output (command not found or such)
+
+void KTimeMon::commandStderr(TDEProcess * /*proc*/, char *buffer, int /*length*/)
+{
+ TQString msgbuf;
+
+ msgbuf = i18n("Got diagnostic output from child command:\n\n");
+ msgbuf += TQString::fromLocal8Bit(buffer);
+
+ KMessageBox::information(this, msgbuf);
+}
+
+
+// -----------------------------------------------------------------------------