summaryrefslogtreecommitdiffstats
path: root/kshutdown/msystemtray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kshutdown/msystemtray.cpp')
-rw-r--r--kshutdown/msystemtray.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/kshutdown/msystemtray.cpp b/kshutdown/msystemtray.cpp
new file mode 100644
index 0000000..f1a9a6e
--- /dev/null
+++ b/kshutdown/msystemtray.cpp
@@ -0,0 +1,212 @@
+/*
+ msystemtray.cpp - A system tray icon
+ Copyright (C) 2003 Konrad Twardowski <kdtonline@poczta.onet.pl>
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "configuration.h"
+#include "miscutils.h"
+#include "mmainwindow.h"
+#include "msystemtray.h"
+
+#include <qtimer.h>
+
+#include <kaction.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+#include <kpopupmenu.h>
+#include <kwin.h>
+
+const double
+ KS_TRAY_FADE_CHANGE = 0.05f,
+ KS_TRAY_FADE_MAX = 0.7f;
+const int KS_TRAY_FADE_TIMEOUT = 50;
+const QColor KS_TRAY_FADE_COLOR = Qt::yellow;
+
+MSystemTray::Mode MSystemTray::_mode = Always;
+MSystemTray *MSystemTray::_instance = 0;
+
+// public
+
+MSystemTray::~MSystemTray()
+{
+ if (_flashIcon)
+ delete _flashIcon;
+ if (_saveIcon)
+ delete _saveIcon;
+}
+
+void MSystemTray::flashIcon()
+{
+ if (_saveIcon)
+ delete _saveIcon;
+ _saveIcon = new QPixmap();
+ *_saveIcon = *pixmap();
+ _flashCount = 0;
+ setPixmap(*_flashIcon);
+ _flashTimer->start(200);
+}
+
+void MSystemTray::setActive(const bool yes)
+{
+ // kdDebug() << "MSystemTray::setActive: " << yes << endl;
+
+ if (_active == yes)
+ return;
+
+ _active = yes;
+ _incFade = _active;
+ _fadeTimer->start(KS_TRAY_FADE_TIMEOUT);
+}
+
+void MSystemTray::setMode(const Mode mode)
+{
+ // kdDebug() << "MSystemTray::setMode: " << mode << endl;
+
+ _mode = mode;
+ switch (_mode)
+ {
+ case Always:
+ ks_tray; // init instance
+ if (ks_actions->active())
+ _instance->setActive(true);
+ _instance->show();
+ MiscUtils::setAutostart(true);
+ break;
+ case IfActive:
+ if (ks_actions->active())
+ {
+ ks_tray; // init instance
+ _instance->setActive(true);
+ _instance->show();
+ MiscUtils::setAutostart(true);
+ }
+ else
+ {
+ delete _instance;
+ _instance = 0;
+ MiscUtils::setAutostart(false);
+ }
+ break;
+ case Never:
+ delete _instance;
+ _instance = 0;
+ MiscUtils::setAutostart(false);
+ break;
+ }
+}
+
+// protected
+
+void MSystemTray::mousePressEvent(QMouseEvent *e)
+{
+ // middle mouse button - display actions menu
+// TODO: 2.0: configure middle button action
+ if (e->button() == MidButton)
+ contextMenu()->popup(e->globalPos());
+ else
+ KSystemTray::mousePressEvent(e);
+}
+
+// private
+
+MSystemTray::MSystemTray()
+ : KSystemTray(ks_main, "MSystemTray"),
+ _active(false),
+ _incFade(true),
+ _fadeValue(0.0f),
+ _flashCount(0),
+ _saveIcon(0)
+{
+ setPixmap(SmallIcon("exit", KIcon::SizeSmallMedium)); // 22x22
+
+// TODO: 2.0: mouse wheel: decrease/increase end time by 5min. (?)
+
+ // init fade timer
+ _fadeTimer = new QTimer(this);
+ connect(_fadeTimer, SIGNAL(timeout()), SLOT(slotFade()));
+
+ // init flash timer
+ _flashTimer = new QTimer(this);
+ connect(_flashTimer, SIGNAL(timeout()), SLOT(slotFlashTimeout()));
+
+ // init icons
+ KPixmap pm(SmallIcon("exit", KIcon::SizeSmallMedium));
+ _flashIcon = new KPixmap(KPixmapEffect::fade(pm, 0.7f, white));
+
+ show();
+
+ // add some items to the context menu
+ KPopupMenu *pm_systemTrayMenu = contextMenu();
+ pm_systemTrayMenu->setCaption("KShutDown");
+ // id 0 = title
+ ks_main->shutDownAction()->plug(pm_systemTrayMenu, 1);
+ ks_main->rebootAction()->plug(pm_systemTrayMenu, 2);
+ ks_main->lockScreenAction()->plug(pm_systemTrayMenu, 3);
+ ks_main->logoutAction()->plug(pm_systemTrayMenu, 4);
+ pm_systemTrayMenu->insertSeparator(5);
+ ks_main->cancelAction()->plug(pm_systemTrayMenu, 6);
+ pm_systemTrayMenu->insertSeparator(7);
+ ks_main->configureKShutDownAction()->plug(pm_systemTrayMenu, 8);
+ pm_systemTrayMenu->insertTearOffHandle();
+
+ // quit signal
+ connect(
+ this, SIGNAL(quitSelected()),
+ ks_main, SLOT(slotQuit()));
+}
+
+// private slots
+
+void MSystemTray::slotFade()
+{
+ if (_incFade)
+ {
+ _fadeValue += KS_TRAY_FADE_CHANGE;
+ if (_fadeValue > KS_TRAY_FADE_MAX)
+ {
+ _fadeTimer->stop();
+ _fadeValue = KS_TRAY_FADE_MAX;
+ }
+ }
+ else
+ {
+ _fadeValue -= KS_TRAY_FADE_CHANGE;
+ if (_fadeValue < 0.0f)
+ {
+ _fadeTimer->stop();
+ _fadeValue = 0.0f;
+ }
+ }
+ KPixmap p(SmallIcon("exit", KIcon::SizeSmallMedium));
+ setPixmap(KPixmapEffect::fade(p, _fadeValue, KS_TRAY_FADE_COLOR));
+}
+
+void MSystemTray::slotFlashTimeout()
+{
+ _flashCount++;
+
+ if ((_flashCount % 2) == 0)
+ setPixmap(*_saveIcon);
+ else
+ setPixmap(*_flashIcon);
+
+ if (_flashCount == 6)
+ _flashTimer->stop();
+}