diff options
Diffstat (limited to 'klaptopdaemon/warning.cpp')
-rw-r--r-- | klaptopdaemon/warning.cpp | 602 |
1 files changed, 602 insertions, 0 deletions
diff --git a/klaptopdaemon/warning.cpp b/klaptopdaemon/warning.cpp new file mode 100644 index 0000000..29944e0 --- /dev/null +++ b/klaptopdaemon/warning.cpp @@ -0,0 +1,602 @@ +/* + * warning.cpp + * + * Copyright (c) 1999 Paul Campbell <paul@taniwha.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. + */ + +#include "warning.h" +#include "portable.h" +#include "version.h" + +#include <klocale.h> +#include <kfiledialog.h> +#include <kmessagebox.h> +#include <kconfig.h> +#include <kurlrequester.h> +#include <kapplication.h> +#include <kcombobox.h> + +#include <qlayout.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qslider.h> +#include <qhbox.h> +#include <qvbuttongroup.h> +#include <qradiobutton.h> +#include <qtooltip.h> + +extern void wake_laptop_daemon(); + +WarningConfig::WarningConfig (int t, QWidget * parent, const char *name) + : KCModule(parent, name), + checkSuspend(0), + checkStandby(0), + checkHibernate(0) +{ + KGlobal::locale()->insertCatalogue("klaptopdaemon"); // For translation of klaptopdaemon messages + + type = t; + apm = laptop_portable::has_power_management(); + config = new KConfig("kcmlaptoprc"); + + my_load(0); + + if (!apm) { + QVBoxLayout *top_layout = new QVBoxLayout( this, KDialog::marginHint(), + KDialog::spacingHint() ); + + KActiveLabel* explain = laptop_portable::no_power_management_explanation(this); + top_layout->addWidget(explain, 0); + + top_layout->addStretch(1); + } else { + QGridLayout *grid = new QGridLayout( this, 11, 2, /* rows x cols */ + KDialog::marginHint(), + KDialog::spacingHint() ); + grid->setColStretch( 1, 1 ); + + int curRow = 0; + // setup the trigger stuff: + if (type) { + checkCriticalTime = new QCheckBox( i18n("Critical &trigger:"), this ); + checkCriticalPercent = new QCheckBox( i18n("Critical &trigger:"), this ); + editCriticalTime = new QSpinBox(1, 60*24, 1, this); + editCriticalTime->setSuffix(i18n("keep short, unit in spinbox", "min")); + QToolTip::add(editCriticalTime, i18n("When this amount of battery life is left the actions below will be triggered")); + editCriticalPercent = new QSpinBox(1, 100, 1, this); + editCriticalPercent->setSuffix(i18n("keep short, unit in spinbox", "%")); + QToolTip::add(editCriticalPercent, i18n("When this amount of battery life is left the actions below will be triggered")); + grid->addWidget(checkCriticalTime, curRow, 0); + grid->addWidget(editCriticalTime, curRow++, Qt::AlignLeft); + grid->addWidget(checkCriticalPercent, curRow, 0); + grid->addWidget(editCriticalPercent, curRow++, Qt::AlignLeft); + + connect(editCriticalTime, SIGNAL(valueChanged(int)), this, SLOT(configChanged())); + connect(editCriticalPercent, SIGNAL(valueChanged(int)), this, SLOT(configChanged())); + connect(checkCriticalTime, SIGNAL(toggled(bool)), this, SLOT(configChanged())); + connect(checkCriticalPercent, SIGNAL(toggled(bool)), this, SLOT(configChanged())); + connect(checkCriticalTime, SIGNAL(toggled(bool)), this, SLOT(checkCriticalTimeChanged(bool))); + connect(checkCriticalPercent, SIGNAL(toggled(bool)), this, SLOT(checkCriticalPercentChanged(bool))); + } else { + checkLowTime = new QCheckBox( i18n("Low &trigger:"), this ); + checkLowPercent = new QCheckBox( i18n("Low &trigger:"), this ); + editLowTime = new QSpinBox(1, 60*24, 1, this); + editLowTime->setSuffix(i18n("keep short, unit in spinbox", "min")); + QToolTip::add(editLowTime, i18n("When this amount of battery life is left the actions below will be triggered")); + editLowPercent = new QSpinBox(1, 100, 1, this); + editLowPercent->setSuffix(i18n("keep short, unit in spinbox", "%")); + QToolTip::add(editLowPercent, i18n("When this amount of battery life is left the actions below will be triggered")); + grid->addWidget(checkLowTime, curRow, 0); + grid->addWidget(editLowTime, curRow++, Qt::AlignLeft); + grid->addWidget(checkLowPercent, curRow, 0); + grid->addWidget(editLowPercent, curRow++, Qt::AlignLeft); + + connect(editLowTime, SIGNAL(valueChanged(int)), this, SLOT(configChanged())); + connect(editLowPercent, SIGNAL(valueChanged(int)), this, SLOT(configChanged())); + connect(checkLowTime, SIGNAL(toggled(bool)), this, SLOT(configChanged())); + connect(checkLowPercent, SIGNAL(toggled(bool)), this, SLOT(configChanged())); + connect(checkLowTime, SIGNAL(toggled(bool)), this, SLOT(checkLowTimeChanged(bool))); + connect(checkLowPercent, SIGNAL(toggled(bool)), this, SLOT(checkLowPercentChanged(bool))); + } + + + // setup the Run Command stuff + checkRunCommand = new QCheckBox(i18n("Run &command:"), this); + grid->addWidget(checkRunCommand, curRow, 0); + + editRunCommand = new KURLRequester( this ); + editRunCommand->setEnabled(false); + connect( checkRunCommand, SIGNAL(toggled(bool)), + editRunCommand, SLOT(setEnabled(bool)) ); + connect( checkRunCommand, SIGNAL(clicked()), + this, SLOT(configChanged()) ); + connect( editRunCommand, SIGNAL(textChanged(const QString&)), + this, SLOT(configChanged()) ); + grid->addWidget(editRunCommand, curRow++, 1); + QToolTip::add( editRunCommand, i18n( "This command will be run when the battery gets low" ) ); + + // setup the Play Sound stuff + checkPlaySound = new QCheckBox(i18n("&Play sound:"), this); + grid->addWidget(checkPlaySound, curRow, 0); + + editPlaySound = new KURLRequester( this ); + editPlaySound->setEnabled(false); + connect( checkPlaySound, SIGNAL(toggled(bool)), + editPlaySound, SLOT(setEnabled(bool)) ); + connect( checkPlaySound, SIGNAL(clicked()), + this, SLOT(configChanged()) ); + connect( editPlaySound, SIGNAL(textChanged(const QString&)), + this, SLOT(configChanged()) ); + grid->addWidget(editPlaySound, curRow++, 1); + QToolTip::add( editPlaySound, i18n( "This sound will play when the battery gets low" ) ); + + // setup the System Sound stuff + checkBeep = new QCheckBox(i18n("System &beep"), this); + grid->addWidget(checkBeep, curRow++, 0); + connect(checkBeep, SIGNAL(clicked()), this, SLOT(configChanged())); + QToolTip::add( checkBeep, i18n( "The system will beep if this is enabled" ) ); + + checkNotify = new QCheckBox(i18n("&Notify"), this); + grid->addWidget(checkNotify, curRow++, 0); + connect(checkNotify, SIGNAL(clicked()), this, SLOT(configChanged())); + + int can_suspend = laptop_portable::has_suspend(); + int can_standby = laptop_portable::has_standby(); + int can_hibernate = laptop_portable::has_hibernation(); + int can_brightness = laptop_portable::has_brightness(); + + if (can_brightness) { + checkBrightness = new QCheckBox(i18n("Panel b&rightness"), this); + checkBrightness->setMinimumSize(checkBrightness->sizeHint()); + QToolTip::add( checkBrightness, i18n( "If enabled the back panel brightness will change" ) ); + grid->addWidget(checkBrightness, curRow, 0); + connect(checkBrightness, SIGNAL(toggled(bool)), this, SLOT(brightness_changed(bool))); + QHBoxLayout *v = new QHBoxLayout(); + v->addWidget(new QLabel("-", this)); + valueBrightness = new QSlider(0, 255, 16, 160, Qt::Horizontal, this); + QToolTip::add( valueBrightness, i18n( "How bright or dim to make the back panel" ) ); + valueBrightness->setMaximumWidth(70); + v->addWidget(valueBrightness); + v->addWidget(new QLabel("+", this)); + v->addStretch(1); + grid->addLayout(v, curRow, 1); + valueBrightness->setEnabled(0); + connect(valueBrightness, SIGNAL(valueChanged(int)), this, SLOT(configChanged())); + ++curRow; + } else { + checkBrightness = 0; + valueBrightness = 0; + } + QStringList performance_list; + int current_performance; + bool *active_list; + bool has_performance = laptop_portable::get_system_performance(0, current_performance, performance_list, active_list); + if (has_performance) { + performance = new QCheckBox(i18n("System performance"), this); + QToolTip::add( performance, i18n( "If enabled the laptop's power performance profile will change" ) ); + grid->addWidget(performance, curRow, 0); + connect (performance, SIGNAL(toggled(bool)), this, SLOT(performance_changed(bool))); + + QHBoxLayout *v = new QHBoxLayout(); + performance_val = new KComboBox(0, this); + performance_val->insertStringList(performance_list); + performance_val->setEnabled(0); + connect (performance_val, SIGNAL(activated(int)), this, SLOT(configChanged())); + QToolTip::add( performance_val, i18n( "The performance profile to change to" ) ); + v->addWidget(performance_val); + v->addStretch(1); + grid->addLayout(v, curRow, 1); + ++curRow; + } else { + performance = 0; + performance_val = 0; + } + QStringList throttle_list; + int current_throttle; + bool has_throttle = laptop_portable::get_system_throttling(0, current_throttle, throttle_list, active_list); + if (has_throttle) { + throttle = new QCheckBox(i18n("CPU throttling"), this); + QToolTip::add( throttle, i18n( "If enabled the CPU performance will be throttled" ) ); + grid->addWidget(throttle, curRow, 0); + connect (throttle, SIGNAL(toggled(bool)), this, SLOT(throttle_changed(bool))); + + QHBoxLayout *v = new QHBoxLayout(); + throttle_val = new KComboBox(0, this); + throttle_val->insertStringList(throttle_list); + throttle_val->setEnabled(0); + connect (throttle_val, SIGNAL(activated(int)), this, SLOT(configChanged())); + QToolTip::add( throttle_val, i18n( "How much to throttle the CPU performance by" ) ); + v->addWidget(throttle_val); + v->addStretch(1); + grid->addLayout(v, curRow, 1); + ++curRow; + } else { + throttle = 0; + throttle_val = 0; + } + + + + QVButtonGroup *b = new QVButtonGroup(i18n("System State Change"), this); + QToolTip::add( b, i18n( "You may choose one of the following to occur when the battery gets low" ) ); + b->layout()->setSpacing( KDialog::spacingHint() ); + if (can_standby) { + checkStandby = new QRadioButton(i18n("Standb&y"), b); + QToolTip::add( checkStandby, i18n( "Move the system into the standby state - a temporary lower power state" ) ); + checkStandby->setMinimumSize(checkStandby->sizeHint()); + connect(checkStandby, SIGNAL(clicked()), this, SLOT(configChanged())); + } + if (can_suspend) { + checkSuspend = new QRadioButton(i18n("&Suspend"), b); + QToolTip::add( checkSuspend, i18n( "Move the system into the suspend state - also known as 'save-to-ram'" ) ); + checkSuspend->setMinimumSize(checkSuspend->sizeHint()); + connect(checkSuspend, SIGNAL(clicked()), this, SLOT(configChanged())); + } + if (can_hibernate) { + checkHibernate = new QRadioButton(i18n("H&ibernate"), b); + QToolTip::add( checkHibernate, i18n( "Move the system into the hibernate state - also known as 'save-to-disk'" ) ); + checkHibernate->setMinimumSize(checkHibernate->sizeHint()); + connect(checkHibernate, SIGNAL(clicked()), this, SLOT(configChanged())); + } + // setup the logout option + checkLogout = new QRadioButton(i18n("&Logout"), b); + connect(checkLogout, SIGNAL(clicked()), this, SLOT(configChanged())); + // setup the shutdown option + checkShutdown = new QRadioButton(i18n("System power off"), b); + QToolTip::add( checkShutdown, i18n( "Power the laptop off" ) ); + connect(checkShutdown, SIGNAL(clicked()), this, SLOT(configChanged())); + + checkNone = new QRadioButton(i18n("&None"), b); + connect(checkNone, SIGNAL(clicked()), this, SLOT(configChanged())); + + grid->addMultiCellWidget(b, curRow, curRow, 0, 1, Qt::AlignLeft|Qt::AlignTop); + curRow++; + + + QLabel* explain; + if (type) { + explain = new QLabel(i18n("This panel controls how and when you receive warnings that your battery power is going to run out VERY VERY soon."), this); + } else { + explain = new QLabel(i18n("This panel controls how and when you receive warnings that your battery power is about to run out"), this); + } + explain->setAlignment( Qt::WordBreak ); + grid->addMultiCellWidget(explain, curRow, curRow, 0, 1); + ++curRow; + + if (!can_suspend && !can_standby && !can_hibernate) { + // display help text: + QLabel* note = laptop_portable::how_to_do_suspend_resume(this); + grid->addMultiCellWidget(note, curRow, curRow, 0, 1); + ++curRow; + } + grid->setRowStretch(curRow++, 1); + + grid->addWidget(new QLabel( i18n("Version: %1").arg(LAPTOP_VERSION), this), + curRow, 1, Qt::AlignRight); + + } + my_load(1); +} + +WarningConfig::~WarningConfig() +{ + delete config; +} + +void WarningConfig::brightness_changed(bool v) +{ + valueBrightness->setEnabled(v); + configChanged(); +} + +void WarningConfig::throttle_changed(bool v) +{ + throttle_val->setEnabled(v); + configChanged(); +} + +void WarningConfig::performance_changed(bool v) +{ + performance_val->setEnabled(v); + configChanged(); +} + +void WarningConfig::checkLowTimeChanged(bool state) +{ + checkLowPercent->setChecked(state ? false : true); + editLowPercent->setEnabled(state ? false : true); +} + +void WarningConfig::checkLowPercentChanged(bool state) +{ + checkLowTime->setChecked(state ? false : true); + editLowTime->setEnabled(state ? false : true); +} + +void WarningConfig::checkCriticalTimeChanged(bool state) +{ + checkCriticalPercent->setChecked(state ? false : true); + editCriticalPercent->setEnabled(state ? false : true); +} + +void WarningConfig::checkCriticalPercentChanged(bool state) +{ + checkCriticalTime->setChecked(state ? false: true); + editCriticalTime->setEnabled(state ? false : true); +} + + +void WarningConfig::save() +{ + if (apm) { + runcommand = checkRunCommand->isChecked(); + playsound = checkPlaySound->isChecked(); + logout = checkLogout->isChecked(); + shutdown = checkShutdown->isChecked(); + beep = checkBeep->isChecked(); + notify = checkNotify->isChecked(); + do_suspend = (checkSuspend? checkSuspend->isChecked() : false); + do_standby = (checkStandby? checkStandby->isChecked() : false); + do_hibernate = (checkHibernate? checkHibernate->isChecked() : false); + do_brightness = (checkBrightness? checkBrightness->isChecked() : false); + val_brightness = (valueBrightness? valueBrightness->value() : 255); + do_performance = (performance? performance->isChecked() : false); + val_performance = (performance_val? performance_val->currentText() : ""); + do_throttle = (throttle? throttle->isChecked() : false); + val_throttle = (throttle_val? throttle_val->currentText() : ""); + runcommand_val = editRunCommand->url(); + if (type) { + time_based_action_critical = checkCriticalTime->isChecked(); + critical_val_time = editCriticalTime->value(); + critical_val_percent = editCriticalPercent->value(); + } else { + time_based_action_low = checkLowTime->isChecked(); + low_val_time = editLowTime->value(); + low_val_percent = editLowPercent->value(); + } + + sound_val = editPlaySound->url(); + } + config->setGroup((type?"BatteryCritical":"BatteryLow")); + + if (config->group() == "BatteryLow") { + config->writeEntry("TimeBasedAction", time_based_action_low); + config->writeEntry("LowValTime", low_val_time); + config->writeEntry("LowValPercent", low_val_percent); + } else { + config->writeEntry("TimeBasedAction", time_based_action_critical); + config->writeEntry("CriticalValTime", critical_val_time); + config->writeEntry("CriticalValPercent", critical_val_percent); + } + config->writeEntry("RunCommand", runcommand); + config->writeEntry("PlaySound", playsound); + config->writeEntry("Logout", logout); + config->writeEntry("Shutdown", shutdown); + config->writeEntry("SystemBeep", beep); + config->writeEntry("Notify", notify); + config->writeEntry("Suspend", do_suspend); + config->writeEntry("Standby", do_standby); + config->writeEntry("Hibernate", do_hibernate); + config->writeEntry("Brightness", do_brightness); + config->writeEntry("BrightnessValue", val_brightness); + config->writeEntry("Performance", do_performance); + config->writeEntry("PerformanceValue", val_performance); + config->writeEntry("Throttle", do_throttle); + config->writeEntry("ThrottleValue", val_throttle); + config->writeEntry("RunCommandPath", runcommand_val); + config->writeEntry("PlaySoundPath", sound_val); + config->sync(); + wake_laptop_daemon(); +} + +void WarningConfig::load() +{ + load( false ); +} + +void WarningConfig::load(bool useDefaults) +{ + if (config == NULL) + return; + my_load(0, useDefaults); + my_load(1, useDefaults); +} + +void WarningConfig::my_load(int x, bool useDefaults ) +{ + config->setReadDefaults( useDefaults ); + + // open the config file + if (!x) { + config->setGroup((type?"BatteryCritical":"BatteryLow")); + + if (config->group() == "BatteryLow") { + time_based_action_low = config->readBoolEntry("TimeBasedAction", true); + low_val_time = config->readNumEntry("LowValTime", 15); + low_val_percent = config->readNumEntry("LowValPercent", 7); + } else { + time_based_action_critical = config->readBoolEntry("TimeBasedAction", true); + critical_val_time = config->readNumEntry("CriticalValTime", 5); + critical_val_percent = config->readNumEntry("CriticalValPercent", 3); + } + runcommand = config->readBoolEntry("RunCommand", false); + playsound = config->readBoolEntry("PlaySound", false); + logout = config->readBoolEntry("Logout", false); + shutdown = config->readBoolEntry("Shutdown", false); + beep = config->readBoolEntry("SystemBeep", true); + notify = config->readBoolEntry("Notify", (type && checkSuspend ? false : true)); + do_suspend = config->readBoolEntry("Suspend", (type && checkSuspend ? true :false)); + do_standby = config->readBoolEntry("Standby", false); + do_hibernate = config->readBoolEntry("Hibernate", false); + do_brightness = config->readBoolEntry("Brightness", false); + val_brightness = config->readNumEntry("BrightnessValue", 255); + do_performance = config->readBoolEntry("Performance", false); + val_performance = config->readEntry("PerformanceValue", ""); + do_throttle = config->readBoolEntry("Throttle", false); + val_throttle = config->readEntry("ThrottleValue", ""); + runcommand_val = config->readEntry("RunCommandPath"); + sound_val = config->readEntry("PlaySoundPath"); + have_time = config->readNumEntry("HaveTime", 2); + if (laptop_portable::has_power_management()) + have_time = laptop_portable::has_battery_time(); + + } else + if (apm) { + checkRunCommand->setChecked(runcommand); + checkPlaySound->setChecked(playsound); + checkBeep->setChecked(beep); + if (checkBrightness) + checkBrightness->setChecked(do_brightness); + if (valueBrightness) { + valueBrightness->setValue(val_brightness); + valueBrightness->setEnabled(do_brightness); + } + if (performance) + performance->setChecked(do_performance); + if (performance_val) { + int ind = 0; + for (int i = 0; i < performance_val->count(); i++) + if (performance_val->text(i) == val_performance) { + ind = i; + break; + } + performance_val->setCurrentItem(ind); + performance_val->setEnabled(do_performance); + } + if (throttle) + throttle->setChecked(do_throttle); + if (throttle_val) { + int ind = 0; + for (int i = 0; i < throttle_val->count(); i++) + if (throttle_val->text(i) == val_throttle) { + ind = i; + break; + } + throttle_val->setCurrentItem(ind); + throttle_val->setEnabled(do_throttle); + } + + checkLogout->setChecked(logout); + checkNotify->setChecked(notify); + checkShutdown->setChecked(shutdown); + if (checkHibernate) { + checkHibernate->setChecked(do_hibernate); + } else { + do_hibernate = 0; + } + if (checkStandby) { + checkStandby->setChecked(do_standby); + } else { + do_standby = 0; + } + if (checkSuspend) { + checkSuspend->setChecked(do_suspend); + } else { + do_suspend = 0; + } + checkNone->setChecked(!do_suspend&!do_standby&!do_hibernate&!logout&!shutdown); + editRunCommand->setURL(runcommand_val); + + if(type) { + checkCriticalTime->setChecked(time_based_action_critical ? true : false); + editCriticalTime->setValue(critical_val_time); + checkCriticalPercent->setChecked(time_based_action_critical ? false : true); + editCriticalPercent->setValue(critical_val_percent); + } else { + checkLowTime->setChecked(time_based_action_low ? true : false); + editLowTime->setValue(low_val_time); + checkLowPercent->setChecked(time_based_action_low ? false : true); + editLowPercent->setValue(low_val_percent); + } + + editPlaySound->setURL(sound_val); + } + emit changed(useDefaults); +} + +void WarningConfig::defaults() +{ + load( true ); +} + + +void WarningConfig::configChanged() +{ + emit changed(true); +} + + +#if 0 +void WarningConfig::enableRunCommand(bool enable) +{ + editRunCommand->setEnabled(enable); + buttonBrowseRunCommand->setEnabled(enable); + configChanged(); +} + +void WarningConfig::enablePlaySound(bool enable) +{ + editPlaySound->setEnabled(enable); + buttonBrowsePlaySound->setEnabled(enable); + configChanged(); +} + +void WarningConfig::browseRunCommand() +{ + KURL url = KFileDialog::getOpenURL(QString::null, QString::null, this ); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + KMessageBox::sorry( 0L, i18n( "Only local files are currently supported." ) ); + return; + } + + editRunCommand->setText( url.path() ); + configChanged(); +} + +void WarningConfig::browsePlaySound() +{ + KURL url = KFileDialog::getOpenURL(QString::null, QString::null, this ); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + KMessageBox::sorry( 0L, i18n( "Only local files are currently supported." ) ); + return; + } + + editPlaySound->setText( url.path() ); + configChanged(); +} +#endif + +QString WarningConfig::quickHelp() const +{ + return i18n("<h1>Low battery Warning</h1>This module allows you to " + "set an alarm in case your battery's charge is about to run out."); +} + +#include "warning.moc" |