summaryrefslogtreecommitdiffstats
path: root/klaptopdaemon/battery.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'klaptopdaemon/battery.cpp')
-rw-r--r--klaptopdaemon/battery.cpp390
1 files changed, 390 insertions, 0 deletions
diff --git a/klaptopdaemon/battery.cpp b/klaptopdaemon/battery.cpp
new file mode 100644
index 0000000..ef43890
--- /dev/null
+++ b/klaptopdaemon/battery.cpp
@@ -0,0 +1,390 @@
+/*
+ * battery.cpp
+ *
+ * Copyright (c) 1999 Paul Campbell <paul@taniwha.com>
+ * Copyright (c) 2002 Marc Mutz <mutz@kde.org>
+ * Copyright (c) 2006 Flavio Castelli <flavio.castelli@gmail.com>
+ *
+ * Requires the Qt widget libraries, available at no cost at
+ * http://www.troll.no/
+ *
+ * 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.
+ */
+
+// my headers:
+#include "battery.h"
+#include "version.h"
+#include "portable.h"
+
+// other KDE headers:
+#include <klocale.h>
+#include <kconfig.h>
+#include <knuminput.h>
+#include <kiconloader.h>
+#include <kicondialog.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <krichtextlabel.h>
+
+// other Qt headers:
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+#include <qvgroupbox.h>
+#include <qhgroupbox.h>
+#include <qgrid.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+extern void wake_laptop_daemon();
+
+
+BatteryConfig::BatteryConfig (QWidget * parent, const char *name)
+ : KCModule(parent, name),
+ editPoll(0),
+ iconloader(0),
+ buttonNoBattery(0),
+ buttonNoCharge(0),
+ buttonCharge(0)
+{
+ KGlobal::locale()->insertCatalogue("klaptopdaemon"); // For translation of klaptopdaemon messages
+
+ apm = laptop_portable::has_power_management();
+ config = new KConfig("kcmlaptoprc");
+ instance = new KInstance("klaptopdaemon");
+
+ QVBoxLayout *top_layout = new QVBoxLayout( this, KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ // do we show the monitor
+ runMonitor = new QCheckBox( i18n("&Show battery monitor"), this );
+ top_layout->addWidget( runMonitor );
+ QToolTip::add( runMonitor, i18n( "This box enables the battery state icon in the panel" ) );
+ connect( runMonitor, SIGNAL(clicked()), this, SLOT(configChanged()) );
+ connect( runMonitor, SIGNAL(clicked()), this, SLOT(runMonitorChanged()) );
+
+ // show also the battery level percentage
+ showLevel = new QCheckBox( i18n("Show battery level percentage"), this );
+ top_layout->addWidget( showLevel );
+ QToolTip::add( showLevel, i18n( "This box enables a text message near the battery state icon containing battery level percentage" ) );
+ connect( showLevel, SIGNAL(clicked()), this, SLOT(configChanged()) );
+
+ notifyMe = new QCheckBox( i18n("&Notify me whenever my battery becomes fully charged"), this );
+ top_layout->addWidget( notifyMe );
+ QToolTip::add( notifyMe, i18n( "This box enables a dialog box that pops up when your battery becomes fully charged" ) );
+ connect( notifyMe, SIGNAL(clicked()), this, SLOT(configChanged()) );
+
+ blankSaver = new QCheckBox( i18n("&Use a blank screen saver when running on battery"), this );
+ top_layout->addWidget( blankSaver );
+ connect( blankSaver, SIGNAL(clicked()), this, SLOT(configChanged()) );
+
+ if (!apm) {
+ top_layout->addWidget( laptop_portable::no_power_management_explanation(this) );
+ } else {
+ iconloader = new KIconLoader("klaptopdaemon");
+
+ // the poll time (in seconds)
+ QHBox *hb = new QHBox( this );
+ hb->setSpacing( KDialog::spacingHint() );
+ top_layout->addWidget( hb );
+
+ QLabel* poll_label = new QLabel( i18n("&Check status every:"), hb );
+ editPoll = new QSpinBox( 1, 3600, 1, hb ); // min,max,step
+ QToolTip::add( editPoll, i18n( "Choose how responsive the laptop software will be when it checks the battery status" ) );
+ editPoll->setSuffix( i18n("keep short, unit in spinbox", "sec") );
+ poll_label->setBuddy( editPoll );
+ connect( editPoll, SIGNAL(valueChanged(int)),
+ this, SLOT(configChanged()) );
+ QWidget* spacer = new QWidget( hb );
+ hb->setStretchFactor( spacer, 1 );
+
+ // group box to hold the icons together
+ QVGroupBox* icons_groupbox = new QVGroupBox( i18n("Select Battery Icons"), this );
+ icons_groupbox->layout()->setSpacing( KDialog::spacingHint() );
+ top_layout->addWidget( icons_groupbox, 0, Qt::AlignLeft );
+
+ // layout to hold the icons inside the groupbox
+ QGrid *icon_grid = new QGrid( 3 /*cols*/, icons_groupbox );
+ icon_grid->setSpacing( KDialog::spacingHint() );
+
+ buttonNoBattery = new KIconButton( iconloader, icon_grid );
+ buttonNoCharge = new KIconButton( iconloader, icon_grid );
+ buttonCharge = new KIconButton( iconloader, icon_grid );
+ (void)new QLabel( buttonNoBattery, i18n("No &battery"), icon_grid);
+ (void)new QLabel( buttonNoCharge, i18n("&Not charging"), icon_grid);
+ (void)new QLabel( buttonCharge, i18n("Char&ging"), icon_grid);
+ buttonNoBattery->setIconType( KIcon::NoGroup, KIcon::Any, 1);
+ buttonNoCharge->setIconType( KIcon::NoGroup, KIcon::Any, 1);
+ buttonCharge->setIconType( KIcon::NoGroup, KIcon::Any, 1);
+ connect(buttonNoBattery, SIGNAL(iconChanged(QString)), this, SLOT(iconChanged()));
+ connect(buttonNoCharge, SIGNAL(iconChanged(QString)), this, SLOT(iconChanged()));
+ connect(buttonCharge, SIGNAL(iconChanged(QString)), this, SLOT(configChanged()));
+
+
+ int num_batteries;
+ QStringList battery_names, battery_states, battery_values;
+ laptop_portable::get_battery_status(num_batteries, battery_names, battery_states, battery_values);
+ if (num_batteries > 0) {
+ QHBoxLayout *hl = new QHBoxLayout();
+ top_layout->addLayout(hl);
+
+ QHGroupBox *hb = new QHGroupBox(i18n("Current Battery Status"), this);
+ for (int i = 0; i < num_batteries; i++) {
+
+ QWidget *wp;
+ if (num_batteries == 1) {
+ wp = new QWidget(hb);
+ } else {
+ wp = new QVGroupBox(battery_names[i], hb);
+ }
+ QVBoxLayout *vb = new QVBoxLayout(wp);
+
+ QLabel *l;
+
+ l = new QLabel(wp); // icon indicating state
+ vb->addWidget(l);
+ batt_label_1.append(l);
+
+ l = new QLabel(QString(""), wp);
+ vb->addWidget(l);
+ batt_label_2.append(l);
+
+ l = new QLabel(QString(""), wp);
+ vb->addWidget(l);
+ batt_label_3.append(l);
+ }
+ hl->addWidget(hb);
+ hl->addStretch(1);
+ (void)startTimer(30*1000); // update 2x every minute
+ }
+
+ // TODO: remove linefeed from string, can't do it right now coz we have a string freeze
+ QLabel* explain = new KRichTextLabel( i18n("This panel controls whether the battery status monitor\nappears in the system tray and what it looks like.").replace("\n"," "), this);
+ top_layout->addWidget(explain, 0);
+ laptop_portable::extra_config(this, config, top_layout);
+ }
+
+ top_layout->addStretch(1);
+ startMonitor = new QPushButton( i18n("&Start Battery Monitor"), this);
+ connect(startMonitor, SIGNAL(clicked()), this, SLOT(slotStartMonitor()));
+ top_layout->addWidget( startMonitor, 0, Qt::AlignRight );
+
+ load();
+}
+
+BatteryConfig::~BatteryConfig()
+{
+ delete instance;
+ delete config;
+}
+
+
+void BatteryConfig::save()
+{
+ enablemonitor = runMonitor->isChecked();
+ showlevel = showLevel->isChecked();
+ useblanksaver = blankSaver->isChecked();
+ notifyme = notifyMe->isChecked();
+
+ if (apm) {
+ poll_time = editPoll->value();
+ nobattery = buttonNoBattery->icon();
+ chargebattery = buttonCharge->icon();
+ nochargebattery = buttonNoCharge->icon();
+ }
+ config->setGroup("BatteryDefault");
+
+ config->writeEntry("Enable", enablemonitor);
+ config->writeEntry("ShowLevel", showlevel);
+ config->writeEntry("NotifyMe", notifyme);
+ config->writeEntry("BlankSaver", useblanksaver);
+ config->writeEntry("Poll", poll_time);
+ config->writeEntry("NoBatteryPixmap", nobattery);
+ config->writeEntry("ChargePixmap", chargebattery);
+ config->writeEntry("NoChargePixmap", nochargebattery);
+ config->sync();
+ changed(false);
+ wake_laptop_daemon();
+}
+
+void BatteryConfig::load()
+{
+ load( false );
+}
+
+void BatteryConfig::load(bool useDefaults)
+{
+ config->setReadDefaults( useDefaults );
+ config->setGroup("BatteryDefault");
+
+ poll_time = config->readNumEntry("Poll", 20);
+ enablemonitor = config->readBoolEntry("Enable", true);
+ showlevel = config->readBoolEntry("ShowLevel", false);
+ notifyme = config->readBoolEntry("NotifyMe", false);
+ useblanksaver = config->readBoolEntry("BlankSaver", false);
+
+ nobattery = config->readEntry("NoBatteryPixmap", "laptop_nobattery");
+ nochargebattery = config->readEntry("NoChargePixmap", "laptop_nocharge");
+ chargebattery = config->readEntry("ChargePixmap", "laptop_charge");
+
+ runMonitor->setChecked(enablemonitor);
+ showLevel->setChecked(showlevel);
+ blankSaver->setChecked(useblanksaver);
+ notifyMe->setChecked(notifyme);
+ if (apm) {
+ editPoll->setValue(poll_time);
+ buttonNoCharge->setIcon(nochargebattery);
+ buttonCharge->setIcon(chargebattery);
+ buttonNoBattery->setIcon(nobattery);
+ }
+ battery_pm = SmallIcon(nochargebattery, 20, KIcon::DefaultState, instance);
+ battery_nopm = SmallIcon(nobattery, 20, KIcon::DefaultState, instance);
+ emit changed(useDefaults);
+ BatteryStateUpdate();
+}
+
+void BatteryConfig::defaults()
+{
+ load( true );
+}
+
+void BatteryConfig::runMonitorChanged()
+{
+ showLevel->setEnabled (runMonitor->isChecked());
+}
+
+void BatteryConfig::configChanged()
+{
+ emit changed(true);
+}
+
+
+QString BatteryConfig::quickHelp() const
+{
+ return i18n("<h1>Laptop Battery</h1>This module allows you to monitor "
+ "your batteries. To make use of this module, you must have power management system software "
+ "installed. (And, of course, you should have batteries in your machine.)");
+}
+
+
+void BatteryConfig::slotStartMonitor()
+{
+ wake_laptop_daemon();
+ if (!enablemonitor) {
+ KMessageBox::information(0, i18n("<qt>The battery monitor has been started, but the tray icon is currently disabled. You can make it appear by selecting the <b>Show battery monitor</b> entry on this page and applying your changes.</qt>"), QString::null, "howToEnableMonitor");
+ }
+}
+
+void
+BatteryConfig::ConvertIcon(int percent, QPixmap &pm, QPixmap &result)
+{
+ QImage image = pm.convertToImage();
+
+ int w = image.width();
+ int h = image.height();
+ int count = 0;
+ QRgb rgb;
+ int x, y;
+ for (x = 0; x < w; x++)
+ for (y = 0; y < h; y++) {
+ rgb = image.pixel(x, y);
+ if (qRed(rgb) == 0xff &&
+ qGreen(rgb) == 0xff &&
+ qBlue(rgb) == 0xff)
+ count++;
+ }
+ int c = (count*percent)/100;
+ if (percent == 100) {
+ c = count;
+ } else
+ if (percent != 100 && c == count)
+ c = count-1;
+
+
+ if (c) {
+ uint ui;
+ QRgb blue = qRgb(0x00,0x00,0xff);
+
+ if (image.depth() <= 8) {
+ ui = image.numColors(); // this fix thanks to Sven Krumpke
+ image.setNumColors(ui+1);
+ image.setColor(ui, blue);
+ } else {
+ ui = 0xff000000|blue;
+ }
+
+ for (y = h-1; y >= 0; y--)
+ for (x = 0; x < w; x++) {
+ rgb = image.pixel(x, y);
+ if (qRed(rgb) == 0xff &&
+ qGreen(rgb) == 0xff &&
+ qBlue(rgb) == 0xff) {
+ image.setPixel(x, y, ui);
+ c--;
+ if (c <= 0)
+ goto quit;
+ }
+ }
+ }
+quit:
+
+ result.convertFromImage(image);
+}
+
+void
+BatteryConfig::BatteryStateUpdate()
+{
+ int num_batteries;
+ QStringList battery_names, battery_states, battery_values;
+ laptop_portable::get_battery_status(num_batteries, battery_names, battery_states, battery_values);
+ if (num_batteries > 0) {
+ for (int i = 0; i < num_batteries; i++) {
+ if (battery_states[i] == "yes") {
+ QPixmap result;
+ ConvertIcon(battery_values[i].toInt(), battery_pm, result);
+ batt_label_1.at(i)->setPixmap(result);
+
+ batt_label_2.at(i)->setText(battery_values[i]+"%");
+
+ batt_label_3.at(i)->setText(i18n("Present"));
+ } else {
+ batt_label_1.at(i)->setPixmap(battery_nopm);
+
+ batt_label_2.at(i)->setText("");
+
+ batt_label_3.at(i)->setText(i18n("Not present"));
+ }
+ }
+ }
+}
+
+void BatteryConfig::iconChanged()
+{
+ nobattery = buttonNoBattery->icon();
+ nochargebattery = buttonNoCharge->icon();
+ battery_pm = SmallIcon(nochargebattery, 20, KIcon::DefaultState, instance);
+ battery_nopm = SmallIcon(nobattery, 20, KIcon::DefaultState, instance);
+ emit changed(true);
+ BatteryStateUpdate();
+}
+
+void BatteryConfig::timerEvent(QTimerEvent *)
+{
+ BatteryStateUpdate();
+}
+
+#include "battery.moc"
+
+