/* * power.cpp * * Copyright (c) 1999 Paul Campbell * Copyright (c) 2002 Marc Mutz * * Requires the TQt 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 "power.h" #include "portable.h" #include "version.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern void wake_laptop_daemon(); PowerConfig::PowerConfig (TQWidget * parent, const char *name) : TDECModule(parent, name), nopowerBox(0), nopowerStandby(0), nopowerSuspend(0), nopowerOff(0), nopowerHibernate(0), nopowerBrightness(0), nopowerValBrightness(0), nopowerThrottle(0), nopowerValThrottle(0), nopowerPerformance(0), nopowerValPerformance(0), powerBox(0), powerStandby(0), powerSuspend(0), powerOff(0), powerHibernate(0), powerBrightness(0), powerValBrightness(0), powerThrottle(0), powerValThrottle(0), powerPerformance(0), powerValPerformance(0), noeditwait(0), editwait(0), enablelav(0), noenablelav(0), noeditlav(0), editlav(0) { TDEGlobal::locale()->insertCatalogue("klaptopdaemon"); // For translation of klaptopdaemon messages apm = laptop_portable::has_power_management(); config = new TDEConfig("kcmlaptoprc"); int can_brightness = laptop_portable::has_brightness(); TQStringList throttle_list; int current_throttle; bool *active_list; bool has_throttle = laptop_portable::get_system_throttling(0, current_throttle, throttle_list, active_list); TQStringList performance_list; int current_performance; bool has_performance = laptop_portable::get_system_performance(0, current_performance, performance_list, active_list); if (!apm && !can_brightness && !has_throttle && !has_performance) { TQVBoxLayout *top_layout = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); KActiveLabel* explain = laptop_portable::no_power_management_explanation(this); top_layout->addWidget(explain); top_layout->addStretch(1); } else { int can_standby = laptop_portable::has_standby(); int can_suspend = laptop_portable::has_suspend(); int can_hibernate = laptop_portable::has_hibernation(); if (!can_standby && !can_suspend && !can_hibernate && !can_brightness && !has_throttle && !has_performance) apm = 0; if (!apm) { TQVBoxLayout *top_layout = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); TQLabel* explain = laptop_portable::how_to_do_suspend_resume(this); top_layout->addWidget(explain); top_layout->addStretch(1); } else { TQVBoxLayout *top_layout = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); TQHBoxLayout *hlay = new TQHBoxLayout( top_layout ); nopowerBox = new TQVButtonGroup(i18n("Not Powered"), this); TQToolTip::add( nopowerBox, i18n( "Options in this box apply when the laptop is unplugged from the wall and has been idle for a while" ) ); nopowerBox->layout()->setSpacing( KDialog::spacingHint() ); hlay->addWidget( nopowerBox ); if (can_standby) { nopowerStandby = new TQRadioButton(i18n("Standb&y"), nopowerBox); TQToolTip::add( nopowerStandby, i18n( "Causes the laptop to change to a standby temporary-low power state" ) ); } if (can_suspend) { nopowerSuspend = new TQRadioButton(i18n("&Suspend"), nopowerBox); TQToolTip::add( nopowerSuspend, i18n( "Causes the laptop to change to a suspend 'save-to-ram' state" ) ); } if (can_hibernate) { nopowerHibernate = new TQRadioButton(i18n("H&ibernate"), nopowerBox); TQToolTip::add( nopowerHibernate, i18n( "Causes the laptop to change to a hibernate 'save-to-disk' state" ) ); } if (can_suspend||can_standby||can_hibernate) nopowerOff = new TQRadioButton(i18n("None"), nopowerBox); if (can_brightness) { nopowerBrightness = new TQCheckBox(i18n("Brightness"), nopowerBox); TQToolTip::add( nopowerBrightness, i18n( "Enables changing the laptop's back panel brightness" ) ); TQWidget *wp = new TQWidget(nopowerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); xl->addWidget(new TQLabel("-", wp)); nopowerValBrightness = new TQSlider(0, 255, 16, 255, Qt::Horizontal, wp); TQToolTip::add( nopowerValBrightness, i18n( "How bright to change the back panel" ) ); nopowerValBrightness->setEnabled(0); connect(nopowerValBrightness, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed())); connect(nopowerBrightness, TQT_SIGNAL(toggled(bool)), nopowerValBrightness, TQT_SLOT(setEnabled(bool))); xl->addWidget(nopowerValBrightness); xl->addWidget(new TQLabel("+", wp)); xl->addStretch(1); } if (has_performance) { nopowerPerformance = new TQCheckBox(i18n("System performance"), nopowerBox); TQToolTip::add( nopowerPerformance, i18n( "Enables changing the laptop's performance profile" ) ); TQWidget *wp = new TQWidget(nopowerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); nopowerValPerformance = new KComboBox(0, wp); TQToolTip::add( nopowerValPerformance, i18n( "Which profile to change it to" ) ); nopowerValPerformance->insertStringList(performance_list); nopowerValPerformance->setEnabled(0); connect(nopowerValPerformance, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changed())); connect(nopowerPerformance, TQT_SIGNAL(toggled(bool)), nopowerValPerformance, TQT_SLOT(setEnabled(bool))); xl->addWidget(nopowerValPerformance); xl->addStretch(1); } if (has_throttle) { nopowerThrottle = new TQCheckBox(i18n("CPU throttle"), nopowerBox); TQToolTip::add( nopowerThrottle, i18n( "Enables throttling the laptop's CPU" ) ); TQWidget *wp = new TQWidget(nopowerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); nopowerValThrottle = new KComboBox(0, wp); TQToolTip::add( nopowerValThrottle, i18n( "How much to throttle the laptop's CPU" ) ); nopowerValThrottle->insertStringList(throttle_list); nopowerValThrottle->setEnabled(0); connect(nopowerValThrottle, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changed())); connect(nopowerThrottle, TQT_SIGNAL(toggled(bool)), nopowerValThrottle, TQT_SLOT(setEnabled(bool))); xl->addWidget(nopowerValThrottle); xl->addStretch(1); } connect(nopowerBox, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(changed())); bool can_lav = laptop_portable::has_lav(); TQHBox *hbox; if (can_lav) { hbox = new TQHBox( nopowerBox ); noenablelav = new TQCheckBox(i18n("Don't act if LAV is >"), hbox); connect(noenablelav, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed())); noeditlav = new KDoubleSpinBox(0.0, 10.0, 0.0, 0.1, 1, hbox); TQToolTip::add( noeditlav, i18n( "If enabled and the system load average is greater than this value none of the above options will be applied" ) ); connect(noeditlav, TQT_SIGNAL(valueChanged(double)), this, TQT_SLOT(changed())); connect(noenablelav, TQT_SIGNAL(toggled(bool)), noeditlav, TQT_SLOT(setEnabled(bool))); } hbox = new TQHBox( nopowerBox ); TQLabel* noedlabel = new TQLabel(i18n("&Wait for:"), hbox); noeditwait = new TQSpinBox( 1, 60*24 /*1 day*/, 1, hbox ); TQToolTip::add( noeditwait, i18n( "How long the computer has to be idle before these values take effect" ) ); noeditwait->setSuffix( i18n("keep short, unit in spinbox", "min") ); noedlabel->setBuddy( noeditwait ); hbox->setStretchFactor( noeditwait, 1 ); connect( noeditwait, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed())); /////////////////////////////////////////////////////////////// powerBox = new TQVButtonGroup(i18n("Powered"), this); powerBox->layout()->setSpacing( KDialog::spacingHint() ); TQToolTip::add( powerBox, i18n( "Options in this box apply when the laptop is plugged into the wall and has been idle for a while" ) ); hlay->addWidget( powerBox ); if (can_standby) { powerStandby = new TQRadioButton(i18n("Sta&ndby"), powerBox); TQToolTip::add( powerStandby, i18n( "Causes the laptop to change to a standby temporary-low power state" ) ); } if (can_suspend) { powerSuspend = new TQRadioButton(i18n("S&uspend"), powerBox); TQToolTip::add( powerSuspend, i18n( "Causes the laptop to change to a suspend 'save-to-ram' state" ) ); } if (can_hibernate) { powerHibernate = new TQRadioButton(i18n("Hi&bernate"), powerBox); TQToolTip::add( powerHibernate, i18n( "Causes the laptop to change to a hibernate 'save-to-disk' state" ) ); } if (can_suspend||can_standby||can_hibernate) powerOff = new TQRadioButton(i18n("None"), powerBox); if (can_brightness) { powerBrightness = new TQCheckBox(i18n("Brightness"), powerBox); TQToolTip::add( powerBrightness, i18n( "Enables changing the laptop's back panel brightness" ) ); TQWidget *wp = new TQWidget(powerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); xl->addWidget(new TQLabel("-", wp)); powerValBrightness = new TQSlider(0, 255, 16, 255, Qt::Horizontal, wp); TQToolTip::add( powerValBrightness, i18n( "How bright to change the back panel" ) ); powerValBrightness->setEnabled(0); connect(powerValBrightness, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed())); connect(powerBrightness, TQT_SIGNAL(toggled(bool)), powerValBrightness, TQT_SLOT(setEnabled(bool))); xl->addWidget(powerValBrightness); xl->addWidget(new TQLabel("+", wp)); xl->addStretch(1); } if (has_performance) { powerPerformance = new TQCheckBox(i18n("System performance"), powerBox); TQToolTip::add( powerPerformance, i18n( "Enables changing the laptop's performance profile" ) ); TQWidget *wp = new TQWidget(powerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); powerValPerformance = new KComboBox(0, wp); TQToolTip::add( powerValPerformance, i18n( "Which profile to change it to" ) ); powerValPerformance->insertStringList(performance_list); powerValPerformance->setEnabled(0); connect(powerValPerformance, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changed())); connect(powerPerformance, TQT_SIGNAL(toggled(bool)), powerValPerformance, TQT_SLOT(setEnabled(bool))); xl->addWidget(powerValPerformance); xl->addStretch(1); } if (has_throttle) { powerThrottle = new TQCheckBox(i18n("CPU throttle"), powerBox); TQToolTip::add( powerThrottle, i18n( "Enables throttling the laptop's CPU" ) ); TQWidget *wp = new TQWidget(powerBox); TQHBoxLayout *xl = new TQHBoxLayout( wp); powerValThrottle = new KComboBox(0, wp); TQToolTip::add( powerValThrottle, i18n( "How much to throttle the laptop's CPU" ) ); powerValThrottle->insertStringList(throttle_list); powerValThrottle->setEnabled(0); connect(powerValThrottle, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changed())); connect(powerThrottle, TQT_SIGNAL(toggled(bool)), powerValThrottle, TQT_SLOT(setEnabled(bool))); xl->addWidget(powerValThrottle); xl->addStretch(1); } connect(powerBox, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(changed())); if (can_lav) { hbox = new TQHBox( powerBox ); enablelav = new TQCheckBox(i18n("Don't act if LAV is >"), hbox); connect( enablelav, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed())); editlav = new KDoubleSpinBox(0.0, 10.0, 0.0, 0.1, 1, hbox); TQToolTip::add( editlav, i18n( "If enabled and the system load average is greater than this value none of the above options will be applied" ) ); connect( editlav, TQT_SIGNAL(valueChanged(double)), this, TQT_SLOT(changed())); connect( enablelav, TQT_SIGNAL(toggled(bool)), editlav, TQT_SLOT(setEnabled(bool)) ); } hbox = new TQHBox( powerBox ); TQLabel* edlabel = new TQLabel(i18n("Wai&t for:"), hbox); editwait = new TQSpinBox( 1, 60*24 /*1 day*/, 1, hbox ); TQToolTip::add( editwait, i18n( "How long the computer has to be idle before these values take effect" ) ); editwait->setSuffix( i18n("keep short, unit in spinbox", "min") ); edlabel->setBuddy( editwait ); hbox->setStretchFactor( editwait, 1 ); connect( editwait, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed())); hlay->addStretch(1); TQLabel* explain = new TQLabel(i18n("This panel configures the behavior of the automatic power-down feature - " "it works as a sort of extreme screen saver. You can configure different " "timeouts and types of behavior depending on whether or not your laptop is " "plugged in to the mains supply."), this ); explain->setAlignment( TQt::WordBreak ); top_layout->addWidget(explain); if (can_standby) { TQLabel* explain3 = new TQLabel(i18n("Different laptops may respond to 'standby' in different ways - in many " "it is only a temporary state and may not be useful for you."), this); explain3->setAlignment( TQt::WordBreak ); top_layout->addWidget(explain3, 0, TQt::AlignLeft); } top_layout->addStretch(1); top_layout->addWidget( new TQLabel( i18n("Version: %1").arg(LAPTOP_VERSION), this ), 0, TQt::AlignRight ); } } load(); } PowerConfig::~PowerConfig() { delete config; } void PowerConfig::save() { if (editwait) { power = getPower(); nopower = getNoPower(); edit_wait = editwait->value(); noedit_wait = noeditwait->value(); nopower_bright_enabled = (nopowerBrightness?nopowerBrightness->isChecked():0); power_bright_enabled = (powerBrightness?powerBrightness->isChecked():0); nopower_bright_val = (nopowerValBrightness?nopowerValBrightness->value():0); power_bright_val = (powerValBrightness?powerValBrightness->value():255); nopower_performance_enabled = (nopowerPerformance?nopowerPerformance->isChecked():0); power_performance_enabled = (powerPerformance?powerPerformance->isChecked():0); nopower_performance_val = (nopowerValPerformance?nopowerValPerformance->currentText():""); power_performance_val = (powerValPerformance?powerValPerformance->currentText():""); nopower_throttle_enabled = (nopowerThrottle?nopowerThrottle->isChecked():0); power_throttle_enabled = (powerThrottle?powerThrottle->isChecked():0); nopower_throttle_val = (nopowerValThrottle?nopowerValThrottle->currentText():""); power_throttle_val = (powerValThrottle?powerValThrottle->currentText():""); edit_lav = (editlav?editlav->value():-1); noedit_lav = (noeditlav?noeditlav->value():-1); lav_enabled = (enablelav?enablelav->isChecked():0); nolav_enabled = (noenablelav?noenablelav->isChecked():0); } config->setGroup("LaptopPower"); config->writeEntry("NoPowerSuspend", nopower); config->writeEntry("PowerSuspend", power); config->writeEntry("PowerWait", edit_wait); config->writeEntry("NoPowerWait", noedit_wait); config->writeEntry("PowerLav", edit_lav); config->writeEntry("NoPowerLav", noedit_lav); config->writeEntry("LavEnabled", lav_enabled); config->writeEntry("NoLavEnabled", nolav_enabled); config->writeEntry("PowerBrightnessEnabled", power_bright_enabled); config->writeEntry("NoPowerBrightnessEnabled", nopower_bright_enabled); config->writeEntry("PowerBrightness", power_bright_val); config->writeEntry("NoPowerBrightness", nopower_bright_val); config->writeEntry("PowerPerformanceEnabled", power_performance_enabled); config->writeEntry("NoPowerPerformanceEnabled", nopower_performance_enabled); config->writeEntry("PowerPerformance", power_performance_val); config->writeEntry("NoPowerPerformance", nopower_performance_val); config->writeEntry("PowerThrottleEnabled", power_throttle_enabled); config->writeEntry("NoPowerThrottleEnabled", nopower_throttle_enabled); config->writeEntry("PowerThrottle", power_throttle_val); config->writeEntry("NoPowerThrottle", nopower_throttle_val); config->sync(); changed(false); wake_laptop_daemon(); } void PowerConfig::load() { load( false ); } void PowerConfig::load(bool useDefaults) { config->setReadDefaults( useDefaults ); config->setGroup("LaptopPower"); nopower = config->readNumEntry("NoPowerSuspend", (nopowerStandby?1:nopowerSuspend?2:0)); power = config->readNumEntry("PowerSuspend", 0); edit_wait = config->readNumEntry("PowerWait", 20); noedit_wait = config->readNumEntry("NoPowerWait", 5); edit_lav = config->readDoubleNumEntry("PowerLav", -1); noedit_lav = config->readDoubleNumEntry("NoPowerLav", -1); lav_enabled = config->readBoolEntry("LavEnabled", 0); nolav_enabled = config->readBoolEntry("NoLavEnabled", 0); nopower_bright_enabled = config->readBoolEntry("NoPowerBrightnessEnabled", 0); power_bright_enabled = config->readBoolEntry("PowerBrightnessEnabled", 0); nopower_bright_val = config->readNumEntry("NoPowerBrightness", 0); power_bright_val = config->readNumEntry("PowerBrightness", 255); nopower_performance_enabled = config->readBoolEntry("NoPowerPerformanceEnabled", 0); power_performance_enabled = config->readBoolEntry("PowerPerformanceEnabled", 0); nopower_performance_val = config->readEntry("NoPowerPerformance", ""); power_performance_val = config->readEntry("PowerPerformance", ""); nopower_throttle_enabled = config->readBoolEntry("NoPowerThrottleEnabled", 0); power_throttle_enabled = config->readBoolEntry("PowerThrottleEnabled", 0); nopower_throttle_val = config->readEntry("NoPowerThrottle", ""); power_throttle_val = config->readEntry("PowerThrottle", ""); // the GUI should reflect the real values if (editwait) { editwait->setValue(edit_wait); noeditwait->setValue(noedit_wait); if (editlav) { editlav->setValue(edit_lav); editlav->setEnabled(lav_enabled); } if (noeditlav) { noeditlav->setValue(noedit_lav); noeditlav->setEnabled(nolav_enabled); } if (enablelav) enablelav->setChecked(lav_enabled); if (noenablelav) noenablelav->setChecked(nolav_enabled); setPower(power, nopower); if (nopowerBrightness) nopowerBrightness->setChecked(nopower_bright_enabled); if (powerBrightness) powerBrightness->setChecked(power_bright_enabled); if (nopowerValBrightness) { nopowerValBrightness->setValue(nopower_bright_val); nopowerValBrightness->setEnabled(nopower_bright_enabled); } if (powerValBrightness) { powerValBrightness->setValue(power_bright_val); powerValBrightness->setEnabled(power_bright_enabled); } if (nopowerPerformance) nopowerPerformance->setChecked(nopower_performance_enabled); if (powerPerformance) powerPerformance->setChecked(power_performance_enabled); if (nopowerValPerformance) { int ind = 0; for (int i = 0; i < nopowerValPerformance->count(); i++) if (nopowerValPerformance->text(i) == nopower_performance_val) { ind = i; break; } nopowerValPerformance->setCurrentItem(ind); nopowerValPerformance->setEnabled(nopower_performance_enabled); } if (powerValPerformance) { int ind = 0; for (int i = 0; i < powerValPerformance->count(); i++) if (powerValPerformance->text(i) == power_performance_val) { ind = i; break; } powerValPerformance->setCurrentItem(ind); powerValPerformance->setEnabled(power_performance_enabled); } if (nopowerThrottle) nopowerThrottle->setChecked(nopower_throttle_enabled); if (powerThrottle) powerThrottle->setChecked(power_throttle_enabled); if (nopowerValThrottle) { int ind = 0; for (int i = 0; i < nopowerValThrottle->count(); i++) if (nopowerValThrottle->text(i) == nopower_throttle_val) { ind = i; break; } nopowerValThrottle->setCurrentItem(ind); nopowerValThrottle->setEnabled(nopower_throttle_enabled); } if (powerValThrottle) { int ind = 0; for (int i = 0; i < powerValThrottle->count(); i++) if (powerValThrottle->text(i) == power_throttle_val) { ind = i; break; } powerValThrottle->setCurrentItem(ind); powerValThrottle->setEnabled(power_throttle_enabled); } } emit changed( useDefaults ); } void PowerConfig::defaults() { load( true ); } int PowerConfig::getNoPower() { if (!apm) return(nopower); if (nopowerHibernate && nopowerHibernate->isChecked()) return 3; if (nopowerStandby && nopowerStandby->isChecked()) return 1; if (nopowerSuspend && nopowerSuspend->isChecked()) return 2; return(0); } int PowerConfig::getPower() { if (!apm || !powerOff) return(power); if (powerHibernate && powerHibernate->isChecked()) return 3; if (powerStandby && powerStandby->isChecked()) return 1; if (powerSuspend && powerSuspend->isChecked()) return 2; return(0); } void PowerConfig::setPower(int p, int np) { if (!apm || nopowerOff == 0) return; if (nopowerSuspend) { nopowerSuspend->setChecked(FALSE); } else { if (np == 2) np = 0; } if (nopowerStandby) { nopowerStandby->setChecked(FALSE); } else { if (np == 1) np = 0; } if (nopowerHibernate) { nopowerHibernate->setChecked(FALSE); } else { if (np == 3) np = 0; } if (nopowerOff) nopowerOff->setChecked(FALSE); switch (np) { case 0: nopowerOff->setChecked(TRUE);break; case 1: nopowerStandby->setChecked(TRUE);break; case 2: nopowerSuspend->setChecked(TRUE);break; case 3: nopowerHibernate->setChecked(TRUE);break; } if (powerSuspend) { powerSuspend->setChecked(FALSE); } else { if (p == 2) p = 0; } if (powerStandby) { powerStandby->setChecked(FALSE); } else { if (p == 1) p = 0; } if (powerHibernate) { powerHibernate->setChecked(FALSE); } else { if (p == 3) p = 0; } if (powerOff) powerOff->setChecked(FALSE); switch (p) { case 0: powerOff->setChecked(TRUE);break; case 1: powerStandby->setChecked(TRUE);break; case 2: powerSuspend->setChecked(TRUE);break; case 3: powerHibernate->setChecked(TRUE);break; } } TQString PowerConfig::quickHelp() const { return i18n("

Laptop Power Control

This module allows you to " "control the power settings of your laptop and set timouts that will trigger " "state changes you can use to save power"); } #include "power.moc"