summaryrefslogtreecommitdiffstats
path: root/src/kpowersave.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kpowersave.cpp')
-rw-r--r--src/kpowersave.cpp2678
1 files changed, 0 insertions, 2678 deletions
diff --git a/src/kpowersave.cpp b/src/kpowersave.cpp
deleted file mode 100644
index a248da5..0000000
--- a/src/kpowersave.cpp
+++ /dev/null
@@ -1,2678 +0,0 @@
- /**************************************************************************
- * Copyright (C) 2004 by Thomas Renninger *
- * <trenn@suse.de> and *
- * 2004-2007 by Danny Kukawka *
- * <dkukawka@suse.de>, <danny.kukawka@web.de> *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of version 2 of the GNU General Public License *
- * as published by the Free Software Foundation. *
- * *
- * 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. *
- ***************************************************************************/
-
-// KDE headers:
-#include <tdeaboutapplication.h>
-#include <tdeapplication.h>
-#include <kaudioplayer.h>
-#include <tdeconfig.h>
-#include <kiconloader.h>
-#include <tdemessagebox.h>
-#include <knotifyclient.h>
-#include <knotifydialog.h>
-#include <kpassivepopup.h>
-#include <tdepopupmenu.h>
-
-// other TQt headers:
-#include <tqcursor.h>
-#include <tqevent.h>
-#include <tqfile.h>
-#include <tqimage.h>
-#include <tqpixmap.h>
-#include <tqtimer.h>
-#include <tqtooltip.h>
-
-// own headers:
-#include "kpowersave.h"
-#include "infodialog.h"
-
-/*!
-* \file kpowersave.cpp
-* \brief This file contains the main functionality of the kpowersave-applet.*/
-
-/*!
- * This is the default constructor of the class kpowersave.
- */
-kpowersave::kpowersave( bool force_acpi_check, bool trace_func ) : KSystemTray(0, "kpowersave"),
- DCOPObject("KPowersaveIface") {
- trace = trace_func;
- kdDebugFuncIn(trace);
-
- display = new screen();
- settings = new Settings();
- autoSuspend = new autosuspend();
- autoDimm = new autodimm();
- hwinfo = new HardwareInfo();
- suspend = hwinfo->getSuspendSupport();
-
- yast2 = NULL;
-
- resume_result = 0;
-
- config = TDEGlobal::config();
- config->setGroup("General");
- if(!config->readBoolEntry("AlreadyStarted", false) || force_acpi_check){
- config->writeEntry("AlreadyStarted", true);
- // check whether APM, ACPI, PMU, CPUFreq or Suspend2Disk/ram supported, otherwise end up
- // and don't start kpowersave ever again until force_acpi_check == true.
- if (!hwinfo->hasACPI() && !hwinfo->hasAPM() && !hwinfo->hasPMU() &&
- !hwinfo->supportCPUFreq() && !suspend.suspend2disk && !suspend.suspend2ram){
- config->writeEntry("Autostart", false);
- config->sync();
- kdError() << "This machine does not support ACPI, APM, PMU, CPUFreq, Suspend2Disk nor "
- << "Suspend2RAM. Please close KPowersave now." << endl;
- exit(-1);
- }
- }
-
- // default init
- if (hwinfo->getAcAdapter()) {
- settings->load_scheme_settings( settings->ac_scheme);
- } else {
- settings->load_scheme_settings( settings->battery_scheme);
- }
- // set the battery warning levels
- hwinfo->setPrimaryBatteriesWarningLevel(settings->batteryWarningLevel,
- settings->batteryLowLevel,
- settings->batteryCriticalLevel);
-
- // connect to signals for changes
- connect(hwinfo, TQT_SIGNAL(generalDataChanged()), this, TQT_SLOT(update()));
- connect(hwinfo, TQT_SIGNAL(primaryBatteryChanged()), this, TQT_SLOT(update()));
- connect(hwinfo, TQT_SIGNAL(ACStatus(bool)), this, TQT_SLOT(handleACStatusChange (bool)));
- connect(hwinfo, TQT_SIGNAL(resumed(int)), this, TQT_SLOT(forwardResumeSignal(int)));
-
- // connect to error mesages
- connect(autoSuspend, TQT_SIGNAL(displayErrorMsg(TQString)), this, TQT_SLOT(showErrorMessage(TQString)));
-
- // connect to events
- connect(hwinfo, TQT_SIGNAL(lidclosetStatus(bool)), this, TQT_SLOT(handleLidEvent(bool)));
- connect(hwinfo, TQT_SIGNAL(powerButtonPressed()), this, TQT_SLOT (handlePowerButtonEvent()));
- connect(hwinfo, TQT_SIGNAL(sleepButtonPressed()), this, TQT_SLOT (handleSleepButtonEvent()));
- connect(hwinfo, TQT_SIGNAL(s2diskButtonPressed()), this, TQT_SLOT (handleS2DiskButtonEvent()));
- connect(hwinfo, TQT_SIGNAL(batteryWARNState(int,int)), this, TQT_SLOT(notifyBatteryStatusChange (int,int)));
- connect(hwinfo, TQT_SIGNAL(desktopSessionIsActive(bool)), this, TQT_SLOT (handleSessionState(bool)));
- connect(autoSuspend, TQT_SIGNAL(inactivityTimeExpired()), this, TQT_SLOT(do_autosuspendWarn()));
- connect(autoDimm, TQT_SIGNAL(inactivityTimeExpired()), this, TQT_SLOT(do_downDimm()));
- connect(autoDimm, TQT_SIGNAL(UserIsActiveAgain()), this, TQT_SLOT(do_upDimm()));
-
- config->sync();
-
- config_dialog_shown = false;
- suspend_dialog_shown = false;
- detailedIsShown = false;
- icon_set_colored = false;
- icon_BG_is_colored = false;
-
- calledSuspend = -1;
- countWhiteIconPixel = 0;
-
- pixmap_name = "NONE";
- suspendType = "NULL";
-
- BAT_WARN_ICON_Timer = new TQTimer(this);
- connect(BAT_WARN_ICON_Timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(do_setIconBG()));
-
- AUTODIMM_Timer = new TQTimer(this);
-
- initMenu();
- update();
- updateCPUFreqMenu();
- setSchemeSettings();
-
- kdDebugFuncOut(trace);
-}
-
-
-/*! This is the default destructor of class kpowersave. */
-kpowersave::~kpowersave(){
- kdDebugFuncIn(trace);
-
- delete hwinfo;
- delete display;
- delete settings;
- delete autoSuspend;
-#ifdef ENABLE_YAST_ENTRY
- delete yast2;
-#endif
-}
-
-/*!
- * use this function to initalise the main kicker menu
- */
-void kpowersave::initMenu() {
- kdDebugFuncIn(trace);
-
- CONFIGURE_ID = this->contextMenu()->insertItem(SmallIcon("configure", TQIconSet::Automatic),
- i18n("Configure KPowersave..."),
- this, TQT_SLOT(showConfigureDialog()));
- CONFIGURE_EVENTS_ID = this->contextMenu()->insertItem(SmallIcon("knotify", TQIconSet::Automatic),
- i18n("Configure Notifications..."),
- this, TQT_SLOT(showConfigureNotificationsDialog()));
-#ifdef ENABLE_YAST_ENTRY
- YAST_MODULE_MENU_ID = this->contextMenu()->insertItem(SmallIcon("yast", TQIconSet::Automatic),
- i18n("Start YaST2 Power Management Module..."),
- this, TQT_SLOT(do_config()));
-#endif
-
- SLEEP_SEPARATOR_MENU_ID = this->contextMenu()->insertSeparator();
- SUSPEND2DISK_MENU_ID = this->contextMenu()->insertItem( SmallIconSet("suspend_to_disk",
- TQIconSet::Automatic),
- i18n("Suspend to Disk"), this,
- TQT_SLOT(do_suspend2disk()));
- SUSPEND2RAM_MENU_ID = this->contextMenu()->insertItem( SmallIconSet("suspend_to_ram",
- TQIconSet::Automatic),
- i18n("Suspend to RAM"), this,
- TQT_SLOT(do_suspend2ram()));
- STANDBY_MENU_ID = this->contextMenu()->insertItem( SmallIconSet("stand_by", TQIconSet::Automatic),
- i18n("Standby"), this, TQT_SLOT(do_standby()));
-
- speed_menu = new TQPopupMenu(this, i18n("Set CPU Frequency Policy").ascii());
- speed_menu->insertItem(i18n("Performance"), PERFORMANCE);
- speed_menu->insertItem(i18n("Dynamic"), DYNAMIC);
- speed_menu->insertItem(i18n("Powersave"), POWERSAVE);
-
- CPUFRETQ_SEPARATOR_MENU_ID = contextMenu()->insertSeparator();
-
- CPUFRETQ_MENU_ID = contextMenu()->insertItem(i18n("Set CPU Frequency Policy"), speed_menu);
- connect(speed_menu, TQT_SIGNAL(activated(int)), this, TQT_SLOT(do_setSpeedPolicy(int)));
- connect(hwinfo, TQT_SIGNAL(currentCPUFreqPolicyChanged()), this, TQT_SLOT(updateCPUFreqMenu()));
-
-
- SCHEME_SEPARATOR_MENU_ID = contextMenu()->insertSeparator();
-
- scheme_menu = new TQPopupMenu(this, i18n("Set Active Scheme").ascii());
- SCHEME_MENU_ID = contextMenu()->insertItem(i18n("Set Active Scheme"), scheme_menu);
- connect(scheme_menu, TQT_SIGNAL(activated(int)), this, TQT_SLOT(do_setActiveScheme(int)));
-
- // menu entry for the autosuspend disable checkbox, disabled by default, only
- // displayed if autosuspend for the current scheme is activated
- AUTOSUSPEND_SEPARATOR_MENU_ID = contextMenu()->insertSeparator();
- AUTOSUSPEND_MENU_ID = this->contextMenu()->insertItem( i18n("Disable Actions on Inactivity"),
- this,TQT_SLOT(do_setAutosuspend()));
- this->contextMenu()->setItemVisible(AUTOSUSPEND_SEPARATOR_MENU_ID, false);
- this->contextMenu()->setItemVisible(AUTOSUSPEND_MENU_ID, false);
-
- HELP_SEPARATOR_MENU_ID = contextMenu()->insertSeparator();
-
- help_menu = new TQPopupMenu(this, i18n("&Help").ascii());
-
- help_menu->insertItem( SmallIcon("help", TQIconSet::Automatic), i18n("&KPowersave Handbook"),
- this, TQT_SLOT(slotHelp()));
- help_menu->insertSeparator();
- help_menu->insertItem( i18n("&Report a bug ..."), this, TQT_SLOT(slotReportBug()));
- help_menu->insertItem( SmallIcon("kpowersave", TQIconSet::Automatic),
- i18n("&About KPowersave"), this, TQT_SLOT(slotAbout()));
-
- HELP_MENU = contextMenu()->insertItem(SmallIcon("help", TQIconSet::Automatic),
- i18n("&Help"), help_menu);
-
- connect(this, TQT_SIGNAL(quitSelected()), this, TQT_SLOT(_quit()));
-
- kdDebugFuncOut(trace);
-}
-
-void kpowersave::resizeEvent ( TQResizeEvent * )
-{
- // Honor Free Desktop specifications that allow for arbitrary system tray icon sizes
- loadIcon(true);
- drawIcon();
-}
-
-/*!
- * This funtion load and manipulate the icons for the kickerapplet-section.
- * The redraw interval depends on \ref icon_set_colored and \ref BAT_icon_BG_intervall.
- */
-void kpowersave::redrawPixmap(){
- kdDebugFuncIn(trace);
-
- // if colored icon_background: normal redraw intervall is set off.
- // Icon (only) redrawed every BAT_icon_BG_intervall
- if (icon_set_colored) {
- if (icon_state_changed) {
- loadIcon();
- drawIcon();
- }
- }
- else {
- loadIcon();
- drawIcon();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Starts the configure dialog of kpowersave.
- */
-void kpowersave::showConfigureDialog() {
- kdDebugFuncIn(trace);
-
- if(!config_dialog_shown) {
- if (settings->schemes.count() > 0){
- configDlg = new ConfigureDialog(config, hwinfo, settings);
- configDlg->show();
- config_dialog_shown = true;
- connect(configDlg, TQT_SIGNAL(destroyed()), this, TQT_SLOT(observeConfigDlg()));
- connect(configDlg, TQT_SIGNAL(openHelp()), this, TQT_SLOT(slotHelp()));
- connect(configDlg, TQT_SIGNAL(openKNotify()), this, TQT_SLOT(showConfigureNotificationsDialog()));
- }
- else {
- KPassivePopup::message(i18n("WARNING"), i18n("Cannot find any schemes."),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- }
- } else {
- configDlg->setWindowState((configDlg->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- configDlg->setActiveWindow();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Starts the notification configure dialog of kpowersave.
- */
-void kpowersave::showConfigureNotificationsDialog() {
- kdDebugFuncIn(trace);
-
- KNotifyDialog::configure(this);
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Load the icons (from filesystem) for the kicker applet to \ref pixmap .
- * To reduce the systemload the icons are only reloaded if \ref pixmap_name
- * is changed.
- */
-void kpowersave::loadIcon(bool forceReload){
- kdDebugFuncIn(trace);
-
- TQString pixmap_name_tmp = "NONE";
-
- BatteryCollection *primary = hwinfo->getPrimaryBatteries();
-
- if ( !hwinfo->isOnline() ) {
- pixmap_name_tmp = TQString("ERROR");
- }
- else if (hwinfo->getAcAdapter() || primary->getBatteryState() == BAT_NONE) {
- icon_set_colored = false;
-
- if (primary->getBatteryState() == BAT_NONE || (primary->getRemainingPercent() < 0 ||
- primary->getRemainingPercent() >= 99))
- pixmap_name_tmp = TQString("laptoppower");
- else
- pixmap_name_tmp = TQString("laptopcharge");
- }
- else {
- switch(primary->getBatteryState()) {
- case BAT_CRIT:
- case BAT_LOW:
- if (icon_BG_is_colored) pixmap_name_tmp = TQString("laptopbattery");
- else pixmap_name_tmp = TQString("laptopbatteryRED");
- icon_BG_is_colored = !icon_BG_is_colored;
- icon_set_colored = true;
- break;
- case BAT_WARN:
- if (icon_BG_is_colored) pixmap_name_tmp = TQString("laptopbattery");
- else pixmap_name_tmp = TQString("laptopbatteryORANGE");
- icon_BG_is_colored = !icon_BG_is_colored;
- icon_set_colored = true;
- break;
- default:
- // if battery is discharging and not in warning, low or critical state
- pixmap_name_tmp = TQString("laptopbattery");
- icon_set_colored = false;
- icon_BG_is_colored = false;
- }
-
- if (icon_set_colored){
- icon_state_changed = false;
- BAT_WARN_ICON_Timer->start(BAT_icon_BG_intervall, true);
- }
- }
-
- // reload icon only if new icon selected
- if ((pixmap_name_tmp != pixmap_name) || (forceReload)) {
- pixmap_name = pixmap_name_tmp;
- if (pixmap_name.startsWith("ERROR")) {
- pixmap = SmallIcon("laptoppower", width(), TDEIcon::DisabledState);
- }
- else
- pixmap = SmallIcon(pixmap_name, width());
- }
-
- kdDebugFuncOut(trace);
-}
-
-
-/*!
- * This function draw the battery-capacity (colored field) to the icon.
- * Here also counted the white pixel in the icon-files. Since the icons are
- * the same and white pixel only in the rectangle of the icon, the white pixel
- * stored in \ref countWhiteIconPixel only one time.
- */
-void kpowersave::drawIcon(){
- kdDebugFuncIn(trace);
-
- BatteryCollection *primary = hwinfo->getPrimaryBatteries();
-
- TQImage image = pixmap.convertToImage();
- int w = image.width();
- int h = image.height();
- int x, y;
- countWhiteIconPixel = 0;
-
- if((pixmap_name.contains("laptopbattery") || pixmap_name.contains("charge")) &&
- countWhiteIconPixel == 0) {
- for (x = 0; x < w; x++)
- for (y = 0; y < h; y++)
- if(TQColor(image.pixel(x, y)) == TQt::white) countWhiteIconPixel++;
- }
-
- int c = (countWhiteIconPixel * primary->getRemainingPercent()) / 100;
-
- if (c > 0) {
- uint ui;
- TQRgb Rgb_set;
-
- if (hwinfo->getAcAdapter()) {
- Rgb_set = tqRgb(0x00, 0xff, 0x00); //green
- }
- else {
- switch(primary->getBatteryState()) {
- case BAT_CRIT:
- case BAT_LOW:
- Rgb_set = tqRgb(0xff, 0x00, 0x00);//red
- break;
- case BAT_WARN:
- Rgb_set = tqRgb(0xff, 0x55, 0x00); //orange
- break;
- default:
- Rgb_set = tqRgb(0x00, 0xff, 0x00); //green
- }
- }
- if (image.depth() <= 8) {
- ui = image.numColors();
- image.setNumColors(ui + 1);
- image.setColor(ui, Rgb_set);
- }
- ui = 0xff000000 | Rgb_set;
-
- for (y = h - 1; y >= 0; y--) {
- for (x = 0; x < w ; x++) {
- if(TQColor(image.pixel(x, y)) == TQt::white) {
- image.setPixel(x, y, ui);
- c--;
- if (c <= 0) goto quit;
- }
- }
- }
- }
-quit:
- image = image.smoothScale(width(), height());
- fullIcon.convertFromImage(image);
- setPixmap(fullIcon);
-
- kdDebugFuncOut(trace);
-}
-
-/*!
-* By this function we fill and update the Tooltip for the icon in the kicker applet.
-* The content of the tooltip alway updated, if something change.
-* \todo Check if the tooltip also updated if mouse \b is over the icon, if not we maybe
-* should implement this.\n If it is possible we should update the tooltip permanently
-* while the mouse cursor is over the widget
-*/
-void kpowersave::updateTooltip(){
- kdDebugFuncIn(trace);
-
- BatteryCollection *primary = hwinfo->getPrimaryBatteries();
- int percent = primary->getRemainingPercent();
- int minutes = primary->getRemainingMinutes();
- int charging_state = primary->getChargingState();
-
- TQString tmp, num3;
- num3.setNum(minutes % 60);
- num3 = num3.rightJustify(2, '0');
-
- if ( !hwinfo->isOnline() ){
- tmp = i18n("No information about battery and AC status available");
- }
- else if (hwinfo->getAcAdapter()) {
- if (percent == 100) tmp = i18n("Plugged in -- fully charged");
- // assume that no battery is there
- else {
- if ((percent < 0 && minutes < 0) || primary->getBatteryState() == BAT_NONE) {
- tmp = i18n("Plugged in");
- }
- else if (minutes > 0){
- if (charging_state == CHARGING)
- tmp = i18n("Plugged in -- %1% charged (%2:%3 h until full "
- "charged)").arg(percent).arg(minutes / 60).arg(num3);
- else
- tmp = i18n("Plugged in -- %1% charged (%2:%3 remaining hours)")
- .arg(percent).arg(minutes / 60).arg(num3);
- }
- else if (charging_state == CHARGING && hwinfo->hasAPM()) {
- tmp = i18n("Plugged in -- %1% charged").arg(percent);
- }
- else{
- if (percent == -1) tmp = i18n("Plugged in -- no battery");
- else tmp = i18n("Plugged in -- %1% charged").arg(percent);
- }
- }
- } else{
- if (minutes >= 0){
- tmp = i18n("Running on batteries -- %1% charged (%2:%3 hours remaining)")
- .arg(percent).arg(minutes / 60).arg(num3);
- }
- else {
- tmp = i18n("Running on batteries -- %1% charged").arg(percent);
- }
- }
- // add string whether battery is charging, but only if < 100% to avoid
- // stupid tooltip message on machines which always with 100% and on AC
- // are charging, as e.g. Sony Vaio FS vgn-fs115b
- if (charging_state == CHARGING && percent < 100)
- tmp += i18n(" -- battery is charging");
-
- TQToolTip::add(this, tmp);
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to starts the Yast2-power-management module. This called by the menuentry
- * with ID \ref YAST_MODULE_MENU_ID, named "Start YaST2 Power Management Module".
- * It create a new TDEProcess and execute "/sbin/yast2 power-management" with tdesu.
- */
-void kpowersave::do_config(){
- kdDebugFuncIn(trace);
-
- #ifdef ENABLE_YAST_ENTRY
- delete yast2;
-
- yast2 = new TDEProcess;
- *yast2 << "tdesu" << "--nonewdcop" << "/sbin/yast2" << "power-management";
-
- connect(yast2, TQT_SIGNAL(processExited(TDEProcess *)),
- TQT_SLOT(slotConfigProcessExited(TDEProcess *)));
- if(!yast2->start(TDEProcess::NotifyOnExit))
- {
- delete yast2;
- yast2 = NULL;
- }
-
- kdDebugFuncOut(trace);
- #else
- kdDebugFuncOut(trace);
- return;
- #endif
-}
-
-/*!
- * \b TQT_SLOT to open the KPowersave help
- */
-void kpowersave::slotHelp()
-{
- kapp->invokeHelp( "", "kpowersave" );
-}
-
-/*!
- * \b TQT_SLOT to open the KPowersave About dialog
- */
-void kpowersave::slotAbout()
-{
- TDEAboutApplication a( this );
- a.exec();
-}
-
-/*!
- * \b TQT_SLOT to open the website to report bugs
- */
-void kpowersave::slotReportBug()
-{
-#ifdef DISTRO_IS_SUSE
- #ifdef DISTRO_IS_SLES_SLED
- kapp->invokeBrowser("https://bugzilla.novell.com/");
- #else
- kapp->invokeBrowser("http://en.opensuse.org/Submitting_Bug_Reports");
- #endif
-#else
- #ifdef DISTRO_IS_ALTLINUX
- kapp->invokeBrowser("http://bugzilla.altlinux.org/");
- #else
- #ifdef DISTRO_IS_UBUNTU
- kapp->invokeBrowser("https://launchpad.net/distros/ubuntu/+bugs");
- #else
- #ifdef DISTRO_IS_PARDUS
- kapp->invokeBrowser("http://bugs.pardus.org.tr/");
- #else
- kapp->invokeBrowser("http://sourceforge.net/tracker/?group_id=124576&atid=700009");
- #endif
- #endif
- #endif
-#endif
-}
-
-/*!
- * \b TQT_SLOT to set the icon background on/off if battery is in critical, low or warning-state. Within
- * this function we set \ref icon_state_changed to true and call \ref redrawPixmap() to redraw the
- * kickerapplet icon and create a icon with blinking background. \n \n
- * The slot called by the TQTimer \ref BAT_WARN_ICON_Timer . The interval of the timer is defined
- * trough \ref BAT_icon_BG_intervall and starts here: \ref loadIcon() .
- */
-void kpowersave::do_setIconBG(){
- kdDebugFuncIn(trace);
-
- if (icon_set_colored) icon_state_changed = true;
- redrawPixmap();
-
- kdDebugFuncOut(trace);
-}
-/*!
- * \b TQT_SLOT to enable/disable the autosuspend.
- */
-void kpowersave::do_setAutosuspend(){
- kdDebugFuncIn(trace);
-
- if(!contextMenu()->isItemChecked(AUTOSUSPEND_MENU_ID)) {
- autoSuspend->stop();
- contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, true);
- }
- else {
- if(settings->autoSuspend) {
- contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, false);
- setAutoSuspend(false);
- }
- else {
- contextMenu()->setItemVisible(AUTOSUSPEND_MENU_ID, false);
- contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, false);
- contextMenu()->setItemVisible(AUTOSUSPEND_SEPARATOR_MENU_ID, false);
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT which called if the \ref configDlg is destroyed. We set within this SLOT
- * \ref config_dialog_shown to false.
- * TODO: check if we maybe should force here the current default scheme depending on the AC/battery state
- */
-void kpowersave::observeConfigDlg(){
- kdDebugFuncIn(trace);
-
- // reload general settings
- settings->load_general_settings();
- // set the battery warning levels - all other general settings don't need to
- // get set, since we check the settings only on events.
- hwinfo->setPrimaryBatteriesWarningLevel(settings->batteryWarningLevel,
- settings->batteryLowLevel,
- settings->batteryCriticalLevel);
-
- // reload the maybe changed scheme settings
- settings->load_scheme_settings( settings->currentScheme );
- // set the scheme
- setSchemeSettings();
-
- config_dialog_shown=false;
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT which called from \ref do_config() if the 'tdesu yast2' TDEProcess exited.
- * This function control the return value and display if needed a errormessage on failure.
- */
-void kpowersave::slotConfigProcessExited(TDEProcess *proc){
- kdDebugFuncIn(trace);
-
- #ifdef ENABLE_YAST_ENTRY
- if (proc->normalExit()){
- if (proc->exitStatus() != 0 && proc->exitStatus() != 16){
- KPassivePopup::message( i18n("WARNING"),
- i18n("Could not start YaST Power Management Module. "
- "Check if it is installed."),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning"), 15000);
- }
- }
- else{
- KPassivePopup::message( i18n("WARNING"),
- i18n("Could not start YaST Power Management Module. "
- "Check if it is installed."),
- SmallIcon("messagebox_warning", 20), this, i18n("Warning"), 15000);
- }
-
- kdDebugFuncOut(trace);
- #else
- kdDebugFuncOut(trace);
- return;
- #endif
-}
-
-/*!
- * \b TQT_SLOT to send the command for "suspend to disk" to HAL daemon.
- * If there is a error while "suspend to disk" the user get e messagebox.
- * This function need a running HAL daemon for "suspend to disk".
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false if command not supported or if powersaved not running
- */
-bool kpowersave::do_suspend2disk(){
- kdDebugFuncIn(trace);
-
- if (suspend.suspend2disk) {
- if (suspend.suspend2disk_allowed || suspend.suspend2disk_allowed == -1) {
- calledSuspend = SUSPEND2DISK;
- if (!handleMounts(true)) {
- kdWarning() << "Could not umount ..." << endl;
- calledSuspend = -1;
- kdDebugFuncOut(trace);
- return false;
- }
-
- if(settings->lockOnSuspend) {
- display->lockScreen( settings->lockmethod );
- }
-
- autoSuspend->stop();
- autoDimm->stop();
- notifySuspend(calledSuspend);
- bool ret = hwinfo->suspend(SUSPEND2DISK);
-
- if (ret) {
- kdDebugFuncOut(trace);
- return true;
- } else {
- KPassivePopup::message( i18n("WARNING"),i18n("Suspend to disk failed"),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- KPassivePopup::message( i18n("WARNING"),
- i18n("Suspend to disk disabled by administrator."),
- SmallIcon("messagebox_warning", 20),
- this, i18n("Warning").ascii(), 15000);
- this->contextMenu()->setItemEnabled(SUSPEND2DISK_MENU_ID, false);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- kdWarning() << "This machine does not provide suspend2disk via HAL" << endl;
- kdDebugFuncOut(trace);
- return false;
- }
-}
-
-/*!
- * \b TQT_SLOT to send the command for "suspend to RAM" to the HAL daemon.
- * If there is a error while "suspend to RAM" the user get e messagebox.
- * This function need a running HAL daemon for "suspend to RAM".
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false if command not supported or if powersaved not running
- */
-bool kpowersave::do_suspend2ram(){
- kdDebugFuncIn(trace);
-
- if (suspend.suspend2ram) {
- if (suspend.suspend2ram_allowed || suspend.suspend2ram_allowed == -1) {
- calledSuspend = SUSPEND2RAM;
- if (!handleMounts(true)) {
- kdWarning() << "Could not umount ..." << endl;
- calledSuspend = -1;
- kdDebugFuncOut(trace);
- return false;
- }
-
- if(settings->lockOnSuspend) {
- display->lockScreen( settings->lockmethod );
- }
-
- autoSuspend->stop();
- autoDimm->stop();
- notifySuspend(calledSuspend);
- bool ret = hwinfo->suspend(SUSPEND2RAM);
-
- if (ret) {
- kdDebugFuncOut(trace);
- return true;
- } else {
- KPassivePopup::message( i18n("WARNING"),i18n("Suspend to RAM failed"),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- KPassivePopup::message( i18n("WARNING"),
- i18n("Suspend to RAM disabled by administrator."),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- this->contextMenu()->setItemEnabled(SUSPEND2RAM_MENU_ID, false);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- kdWarning() << "This machine does not provide suspend2ram via HAL" << endl;
- kdDebugFuncOut(trace);
- return false;
- }
-}
-
-/*!
- * \b TQT_SLOT to send the command for "stand-by" to the HAL daemon.
- * If there is a error while "stand-by" the user get e messagebox.
- * This function need a running HAL daemon for "stand-by".
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false if command not supported or if powersaved not running
- */
-bool kpowersave::do_standby(){
- kdDebugFuncIn(trace);
-
- if (suspend.standby) {
- if (suspend.standby_allowed || suspend.standby_allowed == -1) {
- calledSuspend = STANDBY;
- if (!handleMounts(true)) {
- kdWarning() << "Could not umount ..." << endl;
- calledSuspend = -1;
- kdDebugFuncOut(trace);
- return false;
- }
-
- if(settings->lockOnSuspend) {
- display->lockScreen( settings->lockmethod );
- }
-
- autoSuspend->stop();
- autoDimm->stop();
- notifySuspend(calledSuspend);
- bool ret = hwinfo->suspend(STANDBY);
-
- if (ret) {
- kdDebugFuncOut(trace);
- return true;
- } else {
- KPassivePopup::message( i18n("WARNING"),i18n("Standby failed"),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- KPassivePopup::message( i18n("WARNING"),i18n("Standby disabled by administrator."),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 15000);
- this->contextMenu()->setItemEnabled(STANDBY_MENU_ID, false);
- kdDebugFuncOut(trace);
- return false;
- }
- } else {
- kdWarning() << "This machine does not provide suspend2ram via HAL" << endl;
- kdDebugFuncOut(trace);
- return false;
- }
-}
-
-/*!
- * \b TQT_SLOT to send check if we should display the warning dialog and display
- * the dialog if needed or call directly autosuspend after the signal
- * \ref autosuspend::inactivityTimeExpired was recieved.
- */
-void kpowersave::do_autosuspendWarn() {
- kdDebugFuncIn(trace);
-
- if (settings->autoSuspendCountdown && (settings->autoSuspendCountdownTimeout > 0)) {
- // we have to display the warn dialog
- if(!contextMenu()->isItemChecked(AUTOSUSPEND_MENU_ID)) {
- TQString message;
-
- countdown = new countDownDialog(settings->autoSuspendCountdownTimeout);
-
- if(settings->autoInactiveAction == "Suspend to Disk") {
- countdown->setPixmap("suspend2disk");
- } else if (settings->autoInactiveAction == "Suspend to RAM") {
- countdown->setPixmap("suspend2ram");
- } else if (settings->autoInactiveAction == "Standby") {
- countdown->setPixmap("standby");
- } else {
- countdown->setPixmap("kpowersave");
- }
-
- // TODO: rework this after translation round for openSUSE 10.3 !
- message = i18n("Inactivity detected.") + " " +
- i18n("To stop the %1 press the 'Cancel' button before the countdown "
- "expire.").arg(i18n("Autosuspend")) + "\n\n" +
- i18n("The computer autosuspend in: ");
-
- countdown->setMessageText(message);
-
- connect(countdown, TQT_SIGNAL(dialogClosed(bool)), this, TQT_SLOT(do_autosuspend(bool)));
- countdown->showDialog();
- }
- } else {
- // call directly autosuspend
- do_autosuspend(false);
- }
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to send the related suspend command for autosuspend
- * \param chancel boolean with info if the autosuspend should get chanceld
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false if command not supported or on any other error
- * \todo add check if the requested command is supported befor send and
- * add message for this case to tell that maybe changed config!
- */
-bool kpowersave::do_autosuspend(bool chancel) {
- kdDebugFuncIn(trace);
-
- // TODO: check if this is really needed, it get called also on the suspend methodes
- autoSuspend->stop();
-
- if (!chancel) {
- if(!settings->disableNotifications) {
- KNotifyClient::event( this->winId(), "autosuspend_event",
- i18n("System is going into suspend mode now"));
- }
-
- if(settings->autoSuspend && !contextMenu()->isItemChecked(AUTOSUSPEND_MENU_ID)) {
- if(settings->autoInactiveAction == "Suspend to Disk") {
- return do_suspend2disk();
- } else if (settings->autoInactiveAction == "Suspend to RAM") {
- return do_suspend2ram();
- } else if (settings->autoInactiveAction == "Standby") {
- return do_standby();
- } else {
- return false;
- }
- } else {
- return false;
- }
- } else {
- kdDebug() << "The autosuspend was chanceled (via the chancel dialog), start again." << endl;
- setAutoSuspend(false);
- return false;
- }
-}
-
-/*!
- * \b TQT_SLOT to dimm the display down to the configured level if the signal
- * \ref autodimm::inactivityTimeExpired was recieved.
- * \param
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false else
- */
-void kpowersave::do_downDimm() {
- kdDebugFuncIn(trace);
-
- if (hwinfo->supportBrightness()) {
- if (!AUTODIMM_Timer->isActive()) {
- int dimmToLevel = (int)((float)hwinfo->getMaxBrightnessLevel()*((float)settings->autoDimmTo/100.0));
-
- // check if we really need to dimm down
- if (dimmToLevel < hwinfo->getCurrentBrightnessLevel()) {
- int steps = hwinfo->getCurrentBrightnessLevel() - dimmToLevel;
- int timePerStep = (1500 / steps);
-
- autoDimmDown = true;
-
- AUTODIMM_Timer = new TQTimer(this);
- connect(AUTODIMM_Timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(do_dimm()));
- AUTODIMM_Timer->start(timePerStep, false);
- } else {
- kdWarning() << "Don't dimm down, current level is already lower than requested Level" << endl;
- }
- } else {
- // wait until the timer is stopped, try later!
- TQTimer::singleShot(1500, this, TQT_SLOT(do_downDimm()));
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to dimm the display up to the configured level if the signal
- * \ref autodimm::UserIsActiveAgain was recieved.
- * \param
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false else
- */
-void kpowersave::do_upDimm() {
- kdDebugFuncIn(trace);
-
- //NOTE we go back to the value of the scheme and not the last on, to reduce trouble with the scheme
-
- if (hwinfo->supportBrightness()) {
- if (!AUTODIMM_Timer->isActive()) {
- int dimmToLevel = (int)((float)hwinfo->getMaxBrightnessLevel()*((float)settings->brightnessValue/100.0));
-
- // check if we really need to dimm up
- if (dimmToLevel > hwinfo->getCurrentBrightnessLevel()) {
- int steps = dimmToLevel - hwinfo->getCurrentBrightnessLevel();
- int timePerStep = (750 / steps);
-
- autoDimmDown = false;
-
- AUTODIMM_Timer = new TQTimer(this);
- connect(AUTODIMM_Timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(do_dimm()));
- AUTODIMM_Timer->start(timePerStep, false);
-
- // start autodimm again
- setAutoDimm(false);
- } else {
- kdWarning() << "Don't dimm up, current level is already above requested Level" << endl;
- }
- } else {
- // wait until the timer is stopped, try later!
- TQTimer::singleShot(750, this, TQT_SLOT(do_downDimm()));
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-
-/*!
- * \b TQT_SLOT to dimm the display down
- * \return boolean with the result of the operation
- * \retval true if successful
- * \retval false else
- */
-void kpowersave::do_dimm() {
- kdDebugFuncIn(trace);
-
- int current = hwinfo->getCurrentBrightnessLevel();
-
- if (autoDimmDown) {
- // dimm the display down
- if (current > 0 &&
- current > ((int)((float)hwinfo->getMaxBrightnessLevel()*((float)settings->autoDimmTo/100.0))-1)) {
- hwinfo->setBrightness((current -1) , -1);
- } else {
- AUTODIMM_Timer->stop();
-
- // start checking if the user get active again
- // NOTE: we start this here because the X-Server detect brightness changes as
- // User activity --> FUCKING STUPID PIECE OF SHIT
- autoDimm->startCheckForActivity();
- }
- } else {
- // dimm the display up
- if (current < ((int)((float)hwinfo->getMaxBrightnessLevel()*((float)settings->brightnessValue/100.0))-1)) {
- hwinfo->setBrightness((current +1) , -1);
- } else {
- AUTODIMM_Timer->stop();
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Function handle umount/remount external storage media before/after
- * suspend.
- * \param suspend boolean with info if the machine go into suspend or not
- * \return result of the operation
- * \retval true if all was successful
- * \retval false if not
- */
-bool kpowersave::handleMounts( bool suspend ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "called suspend: " << suspend << endl;
-
- bool _ret = false;
- TQString _errormsg;
-
- if (settings->unmountExternalOnSuspend) {
- TQString _method;
- DCOPRef dcop_ref = DCOPRef( "kded", "mediamanager" );
-
- if (suspend) {
- _method = "unmountAllSuspend()";
- } else {
- _method = "remountAllResume()";
- }
- DCOPReply reply = dcop_ref.call(_method.latin1());
- if ( reply.isValid() ) {
- reply.get(_errormsg);
- if (_errormsg.isEmpty()) {
- kdDebugFuncOut(trace);
- return true;
- } else {
- kdError() << "ERROR while umount/remount partitions: " << _errormsg << endl;
- }
- } else {
- kdWarning() << "Could not umount external storage partitions." << endl;
- }
-
- } else {
- kdDebugFuncOut(trace);
- return true;
- }
-
- // this is only needed for suspend case and an error ...
- // on resume a simple error msg should be enough
- if (!_ret && suspend) {
- // handle error case
- TQString _msg;
- TQString _e_msg;
- TQString _suspend;
-
- if (!_errormsg.isEmpty()) {
- _e_msg = _errormsg;
- } else {
- _e_msg = i18n("Could not call DCOP interface to umount external media.");
- }
-
- // ugly: need qt-tags because mediamanager can return html formated strings !!!
- _msg = "<qt>" +
- i18n("Could not umount external media before suspend/standby. \n "
- "(Reason: %1)\n \n Would you like to continue suspend/standby "
- "anyway? \n(Warning: Continue suspend can cause data loss!)").arg(_e_msg) +
- "</qt>";
-
- _suspend = getSuspendString(calledSuspend);
-
- int answer = KMessageBox::questionYesNo( 0, _msg,
- i18n("Error while prepare %1").arg(_suspend),
- i18n("Suspend anyway"), i18n("Cancel suspend"),
- "ignoreMountOnSuspend");
-
- if (answer == KMessageBox::Yes) {
- _ret = true;
- }
- }
-
- kdDebugFuncOut(trace);
- return _ret;
-}
-
-/*!
- * Handle the event for the power button and call the related action.
- */
-void kpowersave::handlePowerButtonEvent( ) {
- kdDebugFuncIn(trace);
-
- /* Only go to suspend on button event if we already resumed successful.
- This should solve problems if we get may a event for the powerbutton
- if there machine was waked up via power button. */
- if (calledSuspend == -1) {
- handleActionCall(settings->powerButtonAction, settings->powerButtonActionValue);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Handle the event for the suspend2ram/sleep button and call the related action.
- */
-void kpowersave::handleSleepButtonEvent() {
- kdDebugFuncIn(trace);
-
- // Only go to suspend on button event if we already resumed successful.
- if (calledSuspend == -1) {
- handleActionCall(settings->sleepButtonAction, -1);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Handle the event for the suspend2disk (hibernater) button and call the related action.
- */
-void kpowersave::handleS2DiskButtonEvent(){
- kdDebugFuncIn(trace);
-
- // Only go to suspend on button event if we already resumed successful.
- if (calledSuspend == -1) {
- handleActionCall(settings->s2diskButtonAction, -1);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to handle the lidclose event. If the screen get locked
- * depends on the user specific settings.
- * \param closed boolean with info if the lid is closed or not
- */
-void kpowersave::handleLidEvent( bool closed ){
- if (trace) kdDebug() << funcinfo << "IN: " << "Lid closed? " << closed << endl;
-
- if (closed) {
- // get new general settings! This could maybe removed if we
- // could be shure, that the settings are actuall
- settings->load_general_settings();
-
- // handle screen lock
- if (settings->lidcloseAction < 0) {
- if(settings->lockOnLidClose) {
- if(!display->lockScreen( settings->lockmethod )) {
- KPassivePopup::message( i18n("WARNING"),
- i18n("Could not lock the screen. There may "
- "be a problem with the selected \nlock "
- "method or something else."),
- SmallIcon("messagebox_warning", 20), this,
- i18n("Warning").ascii(), 10000);
-
- }
- }
- if(settings->forceDpmsOffOnLidClose) {
- display->forceDPMSOff();
- }
- } else {
- // handle lock action
- if (hwinfo->currentSessionIsActive()) {
- handleActionCall(settings->lidcloseAction, settings->lidcloseActionValue);
- } else {
- kdWarning() << "Session is not active, don't react on lidclose "
- << "event with a action call (like e.g. Suspend)!" << endl;
- }
- }
-
- if(!settings->disableNotifications)
- KNotifyClient::event( this->winId(), "lid_closed_event", i18n("The Lid was closed."));
- } else {
- if(settings->forceDpmsOffOnLidClose) {
- // reset the scheme settings to avoid problems related to call xset on lidclose
- setSchemeSettings();
- }
-
- if (settings->lockOnLidClose) {
- activateLoginScreen();
- }
-
- if(!settings->disableNotifications)
- KNotifyClient::event( this->winId(), "lid_opened_event", i18n("The Lid was opened."));
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to show the login dialog if the desktop was locked before the suspend.
- */
-void kpowersave::activateLoginScreen(){
- kdDebugFuncIn(trace);
-
- // get new general settings! This could maybe removed if we
- // could be shure, that the settings are actuall
- settings->load_general_settings();
-
- if(settings->timeToFakeKeyAfterLock >= 0) {
- TQTimer::singleShot(settings->timeToFakeKeyAfterLock, display, TQT_SLOT(fakeShiftKeyEvent()));
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT to set the current suspend type for later use.
- */
-void kpowersave::setSuspendType( TQString suspendtype){
- kdDebugFuncIn(trace);
-
- suspendType = suspendtype;
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT which called if kpowersave is exited by the user. In this case the user
- * is asked through a yes/no box if "KPowersave start automatically on log in" and the
- * result is written to the KDE configfile.
- */
-void kpowersave::_quit (){
- kdDebugFuncIn(trace);
-
- // set the KDE-Settings back to user default
- if(getenv("TDE_FULL_SESSION")) {
- // first try to call the KDE method via DCOP to reset, if not fall back
- if (!display->resetKDEScreensaver()) {
- settings->load_kde();
- // reset to KDE screensaver settings
- display->blankOnlyScreen(false);
- if(!settings->kde->enabled) display->setScreenSaver(false);
- else display->setScreenSaver(true);
-
- if(!settings->kde->displayEnergySaving) display->setDPMS(false);
- else display->setDPMS(true);
-
- display->has_DPMS = display->setDPMSTimeouts( settings->kde->displayStandby,
- settings->kde->displaySuspend,
- settings->kde->displayPowerOff);
- }
- }
-
- // set, if this is a GNOME session, XScreensaver settings back to user default
- TQString session = getenv("DESKTOP_SESSION");
- if(session.startsWith("gnome")) {
- display->resetXScreensaver();
- }
-
- if(!settings->autostartNeverAsk) {
- TQString tmp1 = i18n ("Start KPowersave automatically when you log in?");
- int tmp2 = KMessageBox::questionYesNo ( 0, tmp1, i18n("Question"),
- i18n("Start Automatically"), i18n("Do Not Start"));
- config->setGroup("General");
- config->writeEntry ("Autostart", tmp2 == KMessageBox::Yes);
- config->sync ();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the user select a 'CPU Frequency Policy' from the menu ( \ref CPUFRETQ_MENU_ID ).
- */
-void kpowersave::do_setSpeedPolicy(int menu_id){
- if (trace) kdDebug() << funcinfo << "IN: " << "menu_id/set policy to: " << menu_id << endl;
-
- if(!hwinfo->setCPUFreq((cpufreq_type)menu_id, settings->cpuFreqDynamicPerformance)) {
- KPassivePopup::message(i18n("WARNING"),
- i18n("CPU Freq Policy %1 could not be set.").arg(speed_menu->text(menu_id)),
- SmallIcon("messagebox_warning", 20), this, i18n("Warning").ascii(), 10000);
- } else {
- hwinfo->checkCurrentCPUFreqPolicy();
- update();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the user select a scheme from the menu. If there is any errormessage
- * while try to set the selected scheme, the user get a messagebox with info.
- */
-void kpowersave::do_setActiveScheme( int i ){
- if (trace) kdDebug() << funcinfo << "IN: " << "set scheme to: " << i << endl;
-
- if(!settings->schemes[i].isEmpty() && (settings->schemes[i] != settings->currentScheme)) {
- for (int x = 0; x < (int) scheme_menu->count(); x++){
- if (x == i)
- scheme_menu->setItemChecked(x, true);
- else
- scheme_menu->setItemChecked(x, false);
- }
- settings->load_scheme_settings( settings->schemes[i]);
- setSchemeSettings();
- notifySchemeSwitch();
- } else if (!settings->schemes[i]){
- KPassivePopup::message( i18n("WARNING"),
- i18n("Scheme %1 could not be activated.").arg(scheme_menu->text(i)),
- SmallIcon("messagebox_warning", 20), this, i18n("Warning").ascii(), 5000);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * This function is invoked if something has to be updated. This including also menu entries.
- * If the battery is in warning state (and powersave set pdaemon->send_battery_state_change_message)
- * the function pop-up a messagebox.
- */
-void kpowersave::update(){
- kdDebugFuncIn(trace);
-
- int redraw_pixmap = 0;
- TQString justMins;
-
- /* need to redraw pixmap in toolbar */
- if (hwinfo->update_info_ac_changed){
- redraw_pixmap = 1;
- }
- if (!hwinfo->isOnline()){
- this->contextMenu()->setItemVisible(SUSPEND2DISK_MENU_ID, false);
- this->contextMenu()->setItemVisible(SUSPEND2RAM_MENU_ID, false);
- this->contextMenu()->setItemVisible(STANDBY_MENU_ID, false);
- this->contextMenu()->setItemVisible(SLEEP_SEPARATOR_MENU_ID, false);
- this->contextMenu()->setItemVisible(SCHEME_SEPARATOR_MENU_ID, false);
- this->contextMenu()->setItemVisible(SCHEME_MENU_ID, false);
- this->contextMenu()->setItemVisible(HELP_SEPARATOR_MENU_ID, false);
- this->contextMenu()->setItemVisible(CONFIGURE_ID, false);
- this->contextMenu()->setItemVisible(CONFIGURE_EVENTS_ID, false);
- if (!pixmap_name.startsWith("ERROR")) {
- // dirty !!! but this work for the moment
- hwinfo->update_info_cpufreq_policy_changed = true;
- suspend = hwinfo->getSuspendSupport();
- redraw_pixmap = 1;
- }
- }
- else{
- if (pixmap_name.startsWith("ERROR")) {
- redraw_pixmap = 1;
- hwinfo->update_info_cpufreq_policy_changed = true;
- suspend = hwinfo->getSuspendSupport();
- }
- this->contextMenu()->setItemVisible(SUSPEND2DISK_MENU_ID, true);
- this->contextMenu()->setItemVisible(SUSPEND2RAM_MENU_ID, true);
- this->contextMenu()->setItemVisible(STANDBY_MENU_ID, true);
- this->contextMenu()->setItemVisible(SLEEP_SEPARATOR_MENU_ID, true);
- this->contextMenu()->setItemVisible(SCHEME_SEPARATOR_MENU_ID, true);
- this->contextMenu()->setItemVisible(SCHEME_MENU_ID, true);
- this->contextMenu()->setItemVisible(HELP_SEPARATOR_MENU_ID, true);
- this->contextMenu()->setItemVisible(CONFIGURE_ID, true);
- this->contextMenu()->setItemVisible(CONFIGURE_EVENTS_ID, true);
-
- if (suspend.suspend2disk && (suspend.suspend2disk_allowed ||
- suspend.suspend2disk_allowed == -1)) {
- this->contextMenu()->setItemEnabled(SUSPEND2DISK_MENU_ID, true);
- } else {
- if (!suspend.suspend2disk)
- this->contextMenu()->setItemVisible(SUSPEND2DISK_MENU_ID, false);
- else
- this->contextMenu()->setItemEnabled(SUSPEND2DISK_MENU_ID, false);
- }
-
- if (suspend.suspend2ram && (suspend.suspend2ram_allowed ||
- suspend.suspend2ram_allowed == -1)) {
- this->contextMenu()->setItemEnabled(SUSPEND2RAM_MENU_ID, true);
- } else {
- if (!suspend.suspend2ram)
- this->contextMenu()->setItemVisible(SUSPEND2RAM_MENU_ID, false);
- else
- this->contextMenu()->setItemEnabled(SUSPEND2RAM_MENU_ID, false);
- }
-
- if (suspend.standby && (suspend.standby_allowed || suspend.standby_allowed == -1)) {
- this->contextMenu()->setItemEnabled(STANDBY_MENU_ID, true);
- } else {
- if (!suspend.standby)
- this->contextMenu()->setItemVisible(STANDBY_MENU_ID, false);
- else
- this->contextMenu()->setItemEnabled(STANDBY_MENU_ID, false);
- }
- }
-
- if (hwinfo->update_info_cpufreq_policy_changed == true){
- updateCPUFreqMenu();
- }
-
- BatteryCollection *primary = hwinfo->getPrimaryBatteries();
-
- if (hwinfo->update_info_primBattery_changed == true){
- justMins.setNum(primary->getRemainingMinutes() % 60);
- justMins = justMins.rightJustify(2, '0');
-
- redraw_pixmap = 1;
- hwinfo->update_info_primBattery_changed = false;
- }
-
- updateSchemeMenu();
-
- if (redraw_pixmap){
- redrawPixmap();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * This function is involved if the CPUFreqMenu must be updated.
- */
-void kpowersave::updateCPUFreqMenu(){
- kdDebugFuncIn(trace);
-
- if (hwinfo->supportCPUFreq() && hwinfo->isOnline() && hwinfo->isCpuFreqAllowed()) {
- /* set CPU frequency menu entries *********/
- /* speed menu has id 3 in context menu */
- contextMenu()->setItemVisible(CPUFRETQ_MENU_ID, true);
- contextMenu()->setItemEnabled(CPUFRETQ_MENU_ID, true);
- contextMenu()->setItemVisible(CPUFRETQ_SEPARATOR_MENU_ID, true);
-
- switch (hwinfo->getCurrentCPUFreqPolicy()){
- case PERFORMANCE:
- speed_menu->setItemChecked(PERFORMANCE, true);
- speed_menu->setItemChecked(DYNAMIC, false);
- speed_menu->setItemChecked(POWERSAVE, false);
- break;
- case DYNAMIC:
- speed_menu->setItemChecked(PERFORMANCE, false);
- speed_menu->setItemChecked(DYNAMIC, true);
- speed_menu->setItemChecked(POWERSAVE, false);
- break;
- case POWERSAVE:
- speed_menu->setItemChecked(PERFORMANCE, false);
- speed_menu->setItemChecked(DYNAMIC, false);
- speed_menu->setItemChecked(POWERSAVE, true);
- break;
- }
- } else {
- /* there never were policies */
- if (!speed_menu) {
- return ;
- } else if (hwinfo->supportCPUFreq() && (hwinfo->isCpuFreqAllowed() != 1)) {
- contextMenu()->setItemEnabled(CPUFRETQ_MENU_ID, false);
- contextMenu()->setItemVisible(CPUFRETQ_SEPARATOR_MENU_ID, true);
- } else{
- /* there were CPU freq policies, but they are not accessible any more */
- /* delete speed_menu */
- contextMenu()->setItemVisible(CPUFRETQ_MENU_ID, false);
- contextMenu()->setItemVisible(CPUFRETQ_SEPARATOR_MENU_ID, false);
- }
- }
-
- hwinfo->update_info_cpufreq_policy_changed = false;
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * The function used to update the scheme menu. A update is needed if
- * if there is maybe new schemes or if the current scheme changed or switched
- * By this way also set the settings for screensaver and other parameter
- * related to the selected scheme.
- */
-void kpowersave::updateSchemeMenu(){
- kdDebugFuncIn(trace);
-
- if (settings->schemes.count() == 0 || !hwinfo->isOnline()){
- /* there never were schemes */
- if (!scheme_menu)
- return ;
- else{
- /* there were schemes, but they are not accessible any more */
- /* delete scheme_menu */
- scheme_menu->clear();
- contextMenu()->setItemVisible(SCHEME_MENU_ID, false);
- contextMenu()->setItemVisible(SCHEME_SEPARATOR_MENU_ID, false);
- return ;
- }
- }
-
- /* redraw all scheme entries ... */
- scheme_menu->clear();
- // clear the list of real scheme names
- org_schemenames.clear();
-
- org_schemenames = settings->schemes;
-
- int x = 0;
- for ( TQStringList::iterator it = org_schemenames.begin(); it != org_schemenames.end(); ++it ) {
-
- TQString _t = *it;
-
- if ( *it == settings->ac_scheme ){
- scheme_menu->insertItem( SmallIcon("scheme_power", TQIconSet::Automatic),
- i18n( ((TQString)*it).ascii() ), x, x);
- }
- else{
- if ( *it == settings->battery_scheme ){
- scheme_menu->insertItem(SmallIcon("scheme_powersave", TQIconSet::Automatic),
- i18n( (*it).ascii() ), x, x);
- }
- else{
- if ((TQString)*it == "Acoustic"){
- scheme_menu->insertItem(SmallIcon("scheme_acoustic",
- TQIconSet::Automatic),
- i18n("Acoustic"), x, x);
- }
- else if ((TQString)*it == "Presentation"){
- scheme_menu->insertItem(SmallIcon("scheme_presentation",
- TQIconSet::Automatic),
- i18n("Presentation"), x, x);
-
- }
- else if((TQString)*it == "AdvancedPowersave") {
- scheme_menu->insertItem(SmallIcon("scheme_advanced_powersave",
- TQIconSet::Automatic),
- i18n( "Advanced Powersave" ), x, x);
- }
- else {
- scheme_menu->insertItem(i18n( (*it).ascii() ), x, x);
- }
- }
- }
-
- if ( *it == settings->currentScheme ) {
- scheme_menu->setItemChecked(x, true);
- }
- ++x;
- }
-
- if (x == 0 && scheme_menu){
- // this should not happen, scheme_list should have been NULL before
- // now we'd have an empty menu ...
- }
- else{
- contextMenu()->setItemVisible(SCHEME_MENU_ID, true);
- contextMenu()->setItemVisible(SCHEME_SEPARATOR_MENU_ID, true);
- }
-
- kdDebugFuncOut(trace);
-}
-
-
-/*!
- * Reimplemented eventhandler for mouse enterEvent. This is called if the mouse cursor
- * enters the widget. In this case if the user move the mouse cursor over the kpowersave
- * trayicon. \n \n
- * We use this event to update the Tooltip with all needed information. The time beetween
- * the event and the automatically popup of the TQToolTip should be long enought to collect
- * the needed values and add a updated Tooltip.
- */
-void kpowersave::enterEvent( TQEvent */*qee*/ ){
-
- updateTooltip();
-
-}
-
-/*!
- * Event handler for mouse wheel events. If the system supports changing display
- * brightness and changing brightness is enabled in the current scheme settings,
- * this will raise the brightness by one level for wheel up events and lower the
- * brightness by one level for wheel down events.
- */
-void kpowersave::wheelEvent (TQWheelEvent *qwe)
-{
- kdDebugFuncIn(trace);
-
- if (!hwinfo->supportBrightness() && settings->brightness)
- return;
-
- if (qwe->orientation () == Qt::Vertical) {
- if (qwe->delta() > 0) {
- do_brightnessUp(5);
- } else {
- do_brightnessDown(5);
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Reimplemented eventhandler for mousePressEvents which is involved if the user click
- * on the icon on the kickerapplet. This was written to guarantee that a click with the
- * right and the left mousebutton activate the menu. In the future this can also used
- * to popup maybe a other menu.
- */
-void kpowersave::mousePressEvent(TQMouseEvent *qme){
- kdDebugFuncIn(trace);
-
- KSystemTray::mousePressEvent(qme);
- if (hwinfo->isOnline()) {
- if (qme->button() == Qt::RightButton){
- // TODO check if maybe some rechecks needed
- this->contextMenu()->exec(TQCursor::pos());
- } else if (qme->button() == Qt::LeftButton) {
- showDetailedDialog();
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the detaileddialog is closed. With this we prevent open
- * the dialog twice, use this function to reset the used variables.
- */
-void kpowersave::closedetaileddialog() {
- detailedIsShown = false;
-}
-
-/*!
- * \b TQT_SLOT used to display messeges in kpowersave. This function
- * block all messeges which we have in kpowersave!
- */
-void kpowersave::showErrorMessage( TQString msg ){
- kdDebugFuncIn(trace);
-
- if(settings->psMsgAsPassivePopup) {
- KPassivePopup::message("KPowersave", msg, SmallIcon("messagebox_warning", 20),
- this, i18n("Warning").ascii(), 10000);
- } else {
- kapp->updateUserTimestamp();
- // KMessageBox::error( 0, msg);
- KMessageBox::queuedMessageBox(0, KMessageBox::Error, msg);
- }
-
- kdDebugFuncOut(trace);
-}
-
-
-/*!
- * Use this function to set the SchemeSettings. This function currently set the
- * e.g. the screensaver and dpms settings. Don't forget to call this function if
- * a scheme is changed or if the settings changed.
- */
-void kpowersave::setSchemeSettings(){
- kdDebugFuncIn(trace);
-
- // --> check if there is a scheme set, if not, use defaults
- if ( settings->currentScheme.isEmpty()) {
- if (hwinfo->getAcAdapter()) {
- settings->load_scheme_settings( settings->ac_scheme);
- } else {
- settings->load_scheme_settings( settings->battery_scheme);
- }
- }
-
- // call setPowerSave() depending on AC state
- if (settings->callSetPowerSaveOnAC) {
- if (hwinfo->getAcAdapter())
- hwinfo->setPowerSave(false);
- else
- hwinfo->setPowerSave(true);
- }
-
- // --> set autosuspend settings
- if(settings->autoSuspend) {
- setAutoSuspend(false);
- } else {
- this->contextMenu()->setItemVisible(AUTOSUSPEND_MENU_ID, false);
- this->contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, false);
- this->contextMenu()->setItemVisible(AUTOSUSPEND_SEPARATOR_MENU_ID, false);
- autoSuspend->stop();
- }
-
- // --> set autodimm settings
- if (settings->autoDimm) {
- setAutoDimm(true);
- } else {
- autoDimm->stop();
- }
-
- // --> set screensaver
- if(settings->specSsSettings){
- if(settings->disableSs) display->setScreenSaver(false);
- else {
- display->setScreenSaver(true);
- if(settings->blankSs) display->blankOnlyScreen(true);
- else {
- display->blankOnlyScreen(false);
- }
- }
-
- } // TODO: check if this really work !!!
- else if(getenv("TDE_FULL_SESSION")) {
- // try to reset the complete screensaver settings. Ff this fail, use own methodes
- if (!display->resetKDEScreensaver()) {
- settings->load_kde();
- // Always disable blankOnly screensaver setting (default). KDE does
- // not provide a GUI to configure it and most likely we are the
- // only ones messing with it
- display->blankOnlyScreen(false);
-
- // reset to global screensaver settings
- if(!settings->kde->enabled) display->setScreenSaver(false);
- else {
- display->setScreenSaver(true);
- // What should we do with settings->kde->lock ?
- // Maybe nothing ?!
- }
- }
- } else if ((getenv("DESKTOP_SESSION") != NULL) && !strcmp(getenv("DESKTOP_SESSION"), "gnome")) {
- // use this to set XScreensaver back to default settings this should
- // also cover the DPMS settings for GNOME/XScreensaver
- display->resetXScreensaver();
- }
-
- // --> set DPMS settings
- if(settings->specPMSettings){
- // set the new DPMS settings
- if(settings->disableDPMS) {
- display->setDPMS(false);
- }
- else {
- display->setDPMS(true);
- display->has_DPMS = display->setDPMSTimeouts( settings->standbyAfter,
- settings->suspendAfter,
- settings->powerOffAfter);
- }
- }
- else if(getenv("TDE_FULL_SESSION")){
- // try to reset the KDE screensaver/DPMS settings (if there are also
- // no special screensaver settings) otherwise fall back and set values from files
- if (!settings->specSsSettings && !display->resetKDEScreensaver()) {
- settings->load_kde();
- // reset to global screensaver settings
- if(!settings->kde->displayEnergySaving) {
- display->setDPMS(false);
- }
- else {
- display->setDPMS(true);
- display->has_DPMS = display->setDPMSTimeouts( settings->kde->displayStandby,
- settings->kde->displaySuspend,
- settings->kde->displayPowerOff);
- }
- }
- }
-
- // --> set brightness settings
- if(settings->brightness && hwinfo->supportBrightness()) {
- // set to given values
- hwinfo->setBrightness (-1, settings->brightnessValue);
- }
-
- // --> set CPU Freq settings
- if(hwinfo->supportCPUFreq()) {
- hwinfo->setCPUFreq( settings->cpuFreqPolicy, settings->cpuFreqDynamicPerformance);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT which called to set and start the autosuspend monitoring.
- * \param resumed boolean value which represent information if machine
- * currently back from suspend/standby
- */
-void kpowersave::setAutoSuspend( bool resumed ){
- if (trace) kdDebug() << funcinfo << "IN: " << "resumed? " << resumed << endl;
-
- if(settings->autoInactiveActionAfter > 0 && settings->autoSuspend) {
- int autoInactiveActionAfter = 0;
-
- if( settings->autoInactiveAction.startsWith("_NONE_")) {
- autoSuspend->stop();
- return;
- }
- if (resumed) {
- autoSuspend->stop();
- delete autoSuspend;
- autoSuspend = new autosuspend();
- connect(autoSuspend, TQT_SIGNAL(inactivityTimeExpired()), this,
- TQT_SLOT(do_autosuspendWarn()));
- }
-
- if (settings->autoSuspendCountdown && (settings->autoSuspendCountdownTimeout > 0)) {
- autoInactiveActionAfter = ((settings->autoInactiveActionAfter * 60) -
- settings->autoSuspendCountdownTimeout);
- } else {
- autoInactiveActionAfter = settings->autoInactiveActionAfter * 60;
- }
-
- if(settings->autoInactiveSBlistEnabled) {
- autoSuspend->start( autoInactiveActionAfter, settings->autoInactiveSBlist );
- }
- else {
- autoSuspend->start( autoInactiveActionAfter, settings->autoInactiveGBlist );
- }
- this->contextMenu()->setItemVisible(AUTOSUSPEND_SEPARATOR_MENU_ID, true);
- this->contextMenu()->setItemVisible(AUTOSUSPEND_MENU_ID, true);
- }
- else {
- // if autosuspend is not NULL: stop autosuspend
- if (autoSuspend) {
- autoSuspend->stop();
- }
-
- this->contextMenu()->setItemVisible(AUTOSUSPEND_MENU_ID, false);
- this->contextMenu()->setItemVisible(AUTOSUSPEND_SEPARATOR_MENU_ID, false);
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT which called to set and start the autodimm monitoring.
- * \param resumed boolean value which represent information if machine
- * currently back from suspend/standby
- */
-void kpowersave::setAutoDimm( bool resumed ){
- if (trace) kdDebug() << funcinfo << "IN: " << "resumed? " << resumed << endl;
-
- if(settings->autoDimmAfter > 0 && settings->autoDimm) {
- if(settings->autoDimmTo < 0) {
- autoDimm->stop();
- kdWarning() << "Not allowed or set level for dimm" << endl;
- } else {
- if (resumed) {
- // setup again
- autoDimm->stop();
- delete autoDimm;
- autoDimm = new autodimm();
- connect(autoDimm, TQT_SIGNAL(inactivityTimeExpired()), this, TQT_SLOT(do_downDimm()));
- connect(autoDimm, TQT_SIGNAL(UserIsActiveAgain()), this, TQT_SLOT(do_upDimm()));
- }
-
- if (settings->autoDimmSBlistEnabled) {
- autoDimm->start(settings->autoDimmAfter * 60, settings->autoDimmSBlist);
- } else {
- autoDimm->start(settings->autoDimmAfter * 60, settings->autoDimmGBlist);
- }
- }
- } else {
- if (autoDimm)
- autoDimm->stop();
- }
-
- kdDebugFuncOut(trace);
-}
-
-// -------- start KNotify functions ------------- //
-
-/*!
- * \b TQT_SLOT called if a battery warning state reached and related signal recieved.
- * Here we emit the related KNotify event, if not disabled.
- * \param type integer with the type of the battery
- * \param state integer represent the reached battery state
- */
-void kpowersave::notifyBatteryStatusChange ( int type, int state ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "type: " << type << "state: " << state << endl;
-
-
- if (type == BAT_PRIMARY) {
- BatteryCollection *primary = hwinfo->getPrimaryBatteries();
- int min = primary->getRemainingMinutes();
-
- if (primary->getChargingState() == CHARGING) {
- kdDebug() << "kpowersave::notifyBatteryStatusChange: Battery is charging, ignore event" << endl;
- return;
- }
- if (hwinfo->getAcAdapter()) {
- // the machine is on AC, no need to inform about battery state,
- // this is maybe only a race condition with not directly actuall
- // charge state
- kdDebug() << "kpowersave::notifyBatteryStatusChange: Machine is on AC, ignore event" << endl;
- kdDebugFuncOut(trace);
- return;
- }
-
- switch (state) {
- case BAT_WARN:
- if (!settings->disableNotifications)
- KNotifyClient::event(this->winId(), "battery_warning_event",
- i18n("Battery state changed to WARNING -- remaining time: "
- "%1 hours and %2 minutes.").arg(min/60).arg(min%60));
- // set/call related actions
- handleActionCall(settings->batteryWarningLevelAction,
- settings->batteryWarningLevelActionValue);
- break;
- case BAT_LOW:
- if (!settings->disableNotifications)
- KNotifyClient::event(this->winId(), "battery_low_event",
- i18n("Battery state changed to LOW -- remaining time: "
- "%1 hours and %2 minutes.").arg(min/60).arg(min%60));
- // set/call related actions
- handleActionCall(settings->batteryLowLevelAction,
- settings->batteryLowLevelActionValue);
- break;
- case BAT_CRIT:
- // handle carefully:
- if (settings->batteryCriticalLevelAction == GO_SHUTDOWN) {
- if (!settings->disableNotifications)
- KNotifyClient::event(this->winId(), "battery_critical_event",
- i18n("Battery state changed to CRITICAL -- "
- "remaining time: %1 hours and %2 minutes.\n"
- "Shut down your system or plug in the power "
- "cable immediately. Otherwise the machine\n"
- "will go shutdown in 30 seconds")
- .arg(min/ 60).arg(min%60));
-
- TQTimer::singleShot(30000, this, TQT_SLOT(handleCriticalBatteryActionCall()));
- } else {
- if (!settings->disableNotifications)
- KNotifyClient::event(this->winId(), "battery_critical_event",
- i18n("Battery state changed to CRITICAL -- "
- "remaining time: %1 hours and %2 minutes.\n"
- "Shut down your system or plug in the power "
- "cable immediately.")
- .arg(min/ 60).arg(min%60));
-
- handleActionCall(settings->batteryCriticalLevelAction,
- settings->batteryCriticalLevelActionValue);
- }
- break;
- default:
- break;
- }
- } else {
- // TODO: add some code later for the other batteries
- }
-
- kdDebugFuncOut(trace);
-}
-
-
-/*!
- * Function to call the action for battery critical event. This is ugly, but
- * because of TQTimer::singleShot() can't take param ...
- * NOTE: Use this only for SHUTDOWN atm
- */
-void kpowersave::handleCriticalBatteryActionCall () {
- kdDebugFuncIn(trace);
-
- handleActionCall(GO_SHUTDOWN, settings->batteryCriticalLevelActionValue, true, true);
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * Function to set a special action for a battery warning level.
- * \param action integer with the type of the action from \ref action
- * \param value integer value of the action as e.g. a brightness level
- * \param checkAC bool if there should be a check for AC state befor call the action
- */
-void kpowersave::handleActionCall ( action action, int value , bool checkAC, bool batWarnCall ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "action: " << action << "value: " << value
- << "checkAC: " << checkAC << endl;
-
- if (hwinfo->currentSessionIsActive()) {
- switch (action) {
- case GO_SHUTDOWN:
- // to be shure if we really need the shutdown
- if ((checkAC && !hwinfo->getAcAdapter()) || !checkAC ) {
- DCOPRef shutdown = DCOPRef( "ksmserver", "ksmserver" );
- shutdown.send("logout", 0, 2, 2);
- }
- break;
- case LOGOUT_DIALOG:
- {
- DCOPRef shutdown = DCOPRef( "ksmserver", "ksmserver" );
- shutdown.send("logout", 1, 2, 2);
- }
- break;
- case GO_SUSPEND2RAM:
- TQTimer::singleShot(100, this, TQT_SLOT(do_suspend2ram()));
- break;
- case GO_SUSPEND2DISK:
- TQTimer::singleShot(100, this, TQT_SLOT(do_suspend2disk()));
- break;
- case BRIGHTNESS:
- hwinfo->setBrightness( -1, value );
- break;
- case CPUFRETQ_POWERSAVE:
- hwinfo->setCPUFreq( POWERSAVE );
- break;
- case CPUFRETQ_DYNAMIC:
- hwinfo->setCPUFreq( DYNAMIC, settings->cpuFreqDynamicPerformance );
- break;
- case CPUFRETQ_PERFORMANCE:
- hwinfo->setCPUFreq( PERFORMANCE );
- break;
- case SWITCH_SCHEME: // not supported atm
- case UNKNOWN_ACTION:
- case NONE:
- default:
- kdError() << "Could not set the requested Action: " << action << endl;
- break;
- }
- } else if (batWarnCall) {
- if (!hwinfo->isPolicyPowerIfaceOwned()) {
- switch (action) {
- case GO_SHUTDOWN:
- // to be shure if we really need the shutdown
- if ((checkAC && !hwinfo->getAcAdapter()) || !checkAC ) {
- DCOPRef shutdown = DCOPRef( "ksmserver", "ksmserver" );
- shutdown.send("logout", 0, 2, 2);
- }
- break;
- default:
- kdError() << "Could not call requested action, inactive session: " << action << endl;
- break;
- }
- }
- } else {
- kdError() << "Could not set the requested action, session is inactiv: " << action << endl;
- }
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if ac stated changed. Here we emit the related KNotify event.
- * and switch to the AC/battery scheme depending on the state of AC
- * \param acstate boolean represent the state of AC (true == AC plugged in ...)
- */
-void kpowersave::handleACStatusChange ( bool acstate , bool notifyEvent ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "acstate: " << acstate << "notifyEvent: " << notifyEvent << endl;
-
- int index;
-
- if (hwinfo->currentSessionIsActive()) {
-
- // emit notify event
- if(notifyEvent && !settings->disableNotifications) {
- if (acstate) {
- KNotifyClient::event(this->winId(), "plug_event", i18n("AC adapter plugged in"));
- } else {
- KNotifyClient::event(this->winId(), "unplug_event", i18n("AC adapter unplugged"));
- }
- }
-
- // handle switch to AC/battery default scheme
- if (acstate) {
- index = settings->schemes.findIndex(settings->ac_scheme);
- } else {
- index = settings->schemes.findIndex(settings->battery_scheme);
- }
-
- if (index != -1)
- do_setActiveScheme(index);
-
- // update applet
- update();
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if scheme switched. Here we emit the related KNotify events
- * if they are not disabled.
- */
-void kpowersave::notifySchemeSwitch() {
- kdDebugFuncIn(trace);
-
- if(!settings->disableNotifications) {
- TQString _scheme = settings->currentScheme;
- TQString eventType;
-
- if( _scheme != "Performance" && _scheme != "Powersave" && _scheme != "Acoustic" &&
- _scheme != "Presentation" && _scheme != "AdvancedPowersave" )
- eventType = "scheme_Unknown";
- else
- eventType = "scheme_" + _scheme;
-
- KNotifyClient::event( this->winId(), eventType,
- i18n("Switched to scheme: %1").arg(i18n(_scheme.ascii())).ascii());
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the machine suspend. Here we emit the related KNotify events
- * if they are not disabled.
- */
-void kpowersave::notifySuspend( int suspendType ) {
- kdDebugFuncIn(trace);
-
- if(!settings->disableNotifications) {
- switch (suspendType) {
- case SUSPEND2DISK:
- KNotifyClient::event( this->winId(), "suspend2disk_event",
- i18n("System is going into %1 now.").
- arg(i18n("Suspend to Disk")));
- break;
- case SUSPEND2RAM:
- KNotifyClient::event( this->winId(), "suspend2ram_event",
- i18n("System is going into %1 now.").
- arg(i18n("Suspend to RAM")));
- break;
- case STANDBY:
- KNotifyClient::event( this->winId(), "standby_event",
- i18n("System is going into %1 now.").
- arg(i18n("Standby")));
- break;
- default:
- break;
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called to independent handleResumeSignal() from event loop and
- * to avoid problems with the QT3 D-Bus bindings
- */
-void kpowersave::forwardResumeSignal( int result ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "result: " << result << endl;
-
- resume_result = result;
-
- TQTimer::singleShot(100, this, TQT_SLOT(handleResumeSignal()));
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the machine suspend. Here we emit the related KNotify events
- * if they are not disabled.
- */
-void kpowersave::handleResumeSignal() {
- kdDebugFuncIn(trace);
-
- // fake key to show the login dialog if we locked the screen
- if(settings->lockOnSuspend) {
- activateLoginScreen();
- }
-
- // reset autosuspend and autodimm
- setAutoSuspend(true);
- setAutoDimm(true);
-
- // reset the CPU Freq Policy ... for more see https://bugzilla.novell.com/show_bug.cgi?id=223164
- if(hwinfo->supportCPUFreq()) {
- hwinfo->setCPUFreq( settings->cpuFreqPolicy, settings->cpuFreqDynamicPerformance );
- }
-
- if(!settings->disableNotifications) {
- switch (calledSuspend) {
- case SUSPEND2DISK:
- KNotifyClient::event( this->winId(), "resume_from_suspend2disk_event",
- i18n("System is resumed from %1.").arg(
- i18n("Suspend to Disk")));
- break;
- case SUSPEND2RAM:
- KNotifyClient::event( this->winId(), "resume_from_suspend2ram_event",
- i18n("System is resumed from %1.").arg(
- i18n("Suspend to RAM")));
- break;
- case STANDBY:
- KNotifyClient::event( this->winId(), "resume_from_standby_event",
- i18n("System is resumed from %1.").arg(
- i18n("Standby")));
- break;
- default:
- kdError() << "called suspend type unknown" << endl;
- break;
-
- }
- }
-
- // handle result of the resume/suspend
- // 1 is a valid return code; don't error out when it is received!
- if ((resume_result == 0) || (resume_result == 1) || (resume_result == INT_MAX)) {
- if ( resume_result == INT_MAX )
- kdWarning() << "Unknown if we successful resumed, look like a D-Bus timeout since "
- << "elapsed time between suspend and resume is higher than 6 hours" << endl;
-
- // successful resumed ... remount only in this case
- if (!handleMounts(false)) {
- KPassivePopup::message( i18n("WARNING"),
- i18n("Could not remount (all) external storage"
- " media."), SmallIcon("messagebox_warning", 20),
- this, i18n("Warning").ascii(), 15000);
- }
- } else {
- kdError() << "Unknown error while suspend. Errorcode: " << resume_result << endl;
- TQString msg;
-
- msg = i18n("An unknown error occurred while %1. The errorcode is: '%2'").
- arg(getSuspendString(calledSuspend)).arg(resume_result);
-
-#if defined(DISTRO_IS_SUSE) || defined(DISTRO_IS_SLES_SLED) || defined(DISTRO_IS_PARDUS)
- // okay we know this system use pm-utils and log is under /var/log/pm-suspend.log
- msg += "\n" + i18n("Do you want to have a look at the log file?");
- int answer = KMessageBox::questionYesNo(0, msg, i18n("Error while %1").
- arg(getSuspendString(calledSuspend)));
- if (answer == KMessageBox::Yes) {
- #if defined(DISTRO_IS_SLES_SLED)
- switch (calledSuspend) {
- case SUSPEND2DISK:
- logview = new LogViewer ("/var/log/suspend2disk.log");
- logview->show();
- break;
- case SUSPEND2RAM:
- logview = new LogViewer ("/var/log/suspend2ram.log");
- logview->show();
- break;
- case STANDBY:
- logview = new LogViewer ("/var/log/standby.log");
- logview->show();
- break;
- default:
- break;
- }
- #else
- logview = new LogViewer ("/var/log/pm-suspend.log");
- logview->show();
- #endif
- }
-#else
- KMessageBox::error(0, msg, i18n("Error while %1").arg(getSuspendString(calledSuspend)));
-#endif
- }
- // set back ... suspend is handled
- calledSuspend = -1;
- resume_result = 0;
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * \b TQT_SLOT called if the state of the current session change
- * \param state boolean represent the state of the session
- * TODO: fix scheme handling
- * TODO: fix critical battery situations (see the todo file in the source)
- */
-void kpowersave::handleSessionState (bool state) {
- kdDebugFuncIn(trace);
-
- if (state) {
- // session is active again
- if (settings->autoSuspend) disableAutosuspend(false);
- if (settings->autoDimm) setAutoDimm(false);
- /* handle may missed/not set AC status changes while the
- session was inactive and set them to the default schemes ?! */
- handleACStatusChange(hwinfo->getAcAdapter(), false);
-
- } else {
- // session is now inactive
- if (settings->autoSuspend) disableAutosuspend(true);
- if (settings->autoDimm) autoDimm->stop();
- }
-
- kdDebugFuncOut(trace);
-}
-
-// -------- end KNotify functions ------------- //
-// ------------ helper functions -------------- //
-
-/*!
- * Helper function to get a i18n name for a suspend type.
- * \param type Integer value with the suspend type
- * \return TQString with the translated name or NULL if it fail
- */
-TQString kpowersave::getSuspendString (int type) {
- kdDebugFuncIn(trace);
-
- switch (type) {
- case SUSPEND2DISK:
- return i18n("Suspend to Disk");
- break;
- case SUSPEND2RAM:
- return i18n("Suspend to RAM");
- break;
- case STANDBY:
- return i18n("Standby");
- break;
- default:
- return TQString();
- }
-
- kdDebugFuncOut(trace);
-}
-
-// --------- end helper functions ------------- //
-// ------------ DCOP functions ---------------- //
-
-/*!
- * DCOP Interface funtion to lock the screen with the userdefined methode.
- * \return boolean with the result of locking the screen
- * \retval true if locking the screen was successful
- * \retval false if locking the screen failed or the user don't wan't to lock
- */
-bool kpowersave::lockScreen(){
- kdDebugFuncIn(trace);
-
- settings->load_general_settings();
-
- return display->lockScreen( settings->lockmethod );
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * DCOP Interface funtion to return the name of the current powersave scheme.
- * \return TQString with the name of the current scheme
- */
-TQString kpowersave::currentScheme (){
- kdDebugFuncIn(trace);
-
- if(hwinfo->isOnline()) {
- return settings->currentScheme;
- } else {
- return "ERROR: D-Bus and/or HAL not running";
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * DCOP Interface funtion to return the name of the current cpuFreqPolicy.
- * \return TQString with the name of the current cpuFreqPolicy
- */
-TQString kpowersave::currentCPUFreqPolicy() {
- kdDebugFuncIn(trace);
-
- if(hwinfo->isOnline()) {
- TQString _cpuFreq = "";
- switch (hwinfo->getCurrentCPUFreqPolicy()){
- case PERFORMANCE:
- _cpuFreq = "PERFORMANCE";
- break;
- case DYNAMIC:
- _cpuFreq = "DYNAMIC";
- break;
- case POWERSAVE:
- _cpuFreq = "POWERSAVE";
- break;
- default:
- _cpuFreq = "UNKNOWN";
- break;
- }
- return _cpuFreq;
- } else {
- return "ERROR: HAL or/and DBus not running";
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * DCOP Interface funtion to send a list with the allowed
- * CPU Frequency states.
- * \return TQStringList with the supported CPUFreq states
- */
-TQStringList kpowersave::listCPUFreqPolicies() {
- kdDebugFuncIn(trace);
-
- TQStringList ret_list;
- if (hwinfo->isCpuFreqAllowed()) {
- ret_list.append("PERFORMANCE");
- ret_list.append("DYNAMIC");
- ret_list.append("POWERSAVE");
- }
- else {
- ret_list.append("NOT SUPPORTED");
- }
-
- kdDebugFuncOut(trace);
- return ret_list;
-}
-
-/*!
- * DCOP Interface funtion to set the current CPUFreq policy
- * \param policy TQString with the policy to set, only values from
- * list_CPUFreqPolicies are allowed (except "NOT SUPPORTED")
- * \return boolean with the result of set the requested CPUFreq policy
- * \retval true if successful set
- * \retval false if not supported or any other failure
- */
-bool kpowersave::do_setCPUFreqPolicy( TQString policy ) {
- if (trace) kdDebug() << funcinfo << "IN: " << "policy: " << policy << endl;
-
-
- bool ret = true;
- /*
- if (hwinfo->isCpuFreqAllowed() && hwinfo->isOnline()) {
- if (policy == "PERFORMANCE") {
- hwinfo->setCPUFreq(PERFORMANCE);
- } else if (policy == "DYNAMIC") {
- hwinfo->setCPUFreq(DYNAMIC, settings->cpuFreqDynamicPerformance);
- } else if (policy == "POWERSAVE") {
- hwinfo->setCPUFreq(POWERSAVE);
- } else {
- kdDebugFuncOut(trace);
- ret = false;
- }
- } else {
- ret = false;
- }
- */
- kdDebugFuncOut(trace);
- return ret;
-}
-
-/*!
- * DCOP Interface funtion to send a list with the supported and enabled
- * sleeping states.
- * \return TQStringList with the supported spleeping states
- */
-TQStringList kpowersave::allowed_sleepingStates(){
- kdDebugFuncIn(trace);
-
- TQStringList sleepList;
- if(hwinfo->isOnline()) {
- if (suspend.suspend2disk && (suspend.suspend2disk_allowed ||
- suspend.suspend2disk_allowed == -1)){
- sleepList.append("suspendToDisk");
- }
- if (suspend.suspend2ram && (suspend.suspend2ram_allowed ||
- suspend.suspend2ram_allowed == -1)){
- sleepList.append("suspendToRAM");
- }
- if (suspend.standby && (suspend.standby_allowed || suspend.standby_allowed == -1)){
- sleepList.append("standBy");
- }
- if(sleepList.isEmpty()){
- sleepList.append("NO_SLEEPING_STATES_SUPPORTED");
- }
- }
- else {
- sleepList.append("ERROR: D-Bus and/or HAL not running");
- }
-
- kdDebugFuncOut(trace);
- return sleepList;
-}
-
-/*!
- * DCOP Interface funtion to send a list with the all schemes.
- * \return TQStringList with all schemes
- */
-TQStringList kpowersave::listSchemes(){
- kdDebugFuncIn(trace);
-
- TQStringList _schemeList;
- if(hwinfo->isOnline()) {
- if (settings->schemes.count() > 0){
- _schemeList = settings->schemes;
- }
- }
- else {
- _schemeList.append("ERROR: D-Bus and/or HAL not running");
- }
-
- kdDebugFuncOut(trace);
- return _schemeList;
-}
-
-
-/*!
- * DCOP Interface funtion to set the current scheme.
- * \return boolean with the result of set the requested scheme
- * \retval false if failed (e.g. scheme is not in the list)
- * \retval true if scheme found and set
- * \param _scheme TQString with the scheme to set, scheme should be
- * named as list from list_schemes()
- */
-bool kpowersave::do_setScheme( TQString /*_scheme*/ ) {
- kdDebugFuncIn(trace);
-
-/* int index;
- index = settings->schemes.findIndex(_scheme);
-
- if (index != -1) {
- do_setActiveScheme(index);
- kdDebugFuncOut(trace);
- return true;
- }
- else {
- kdDebugFuncOut(trace);
- return false;
- }
-*/
- kdDebugFuncOut(trace);
- return false;
-}
-
-/*!
- * DCOP Interface funtion to send the suspend to disk command to powersave.
- * \return boolean with the result of calling do_suspend2disk()
- * \retval true if successful
- * \retval false if not supported or powersaved not running
- */
-bool kpowersave::do_suspendToDisk(){
- kdDebugFuncIn(trace);
- kdDebugFuncOut(trace);
- return do_suspend2disk();
-}
-
-/*!
- * DCOP Interface funtion to send the suspend to disk command to powersave.
- * \return boolean with the result of calling do_suspend2ram()
- * \retval true if successful
- * \retval false if not supported or powersaved not running
- */
-bool kpowersave::do_suspendToRAM(){
- kdDebugFuncIn(trace);
- kdDebugFuncOut(trace);
- return do_suspend2ram();
-}
-
-/*!
- * DCOP Interface funtion to send the suspend to disk command to powersave.
- * \return boolean with the result of calling do_standby()
- * \retval true if successful
- * \retval false if not supported or powersaved not running
- */
-bool kpowersave::do_standBy(){
- kdDebugFuncIn(trace);
- kdDebugFuncOut(trace);
- return do_standby();
-}
-
-//! dcop function to set the brightness up
-bool kpowersave::do_brightnessUp(int percentageStep) {
- kdDebugFuncIn(trace);
-
- bool retval = false;
-
- if(hwinfo->isOnline()) {
- retval = hwinfo->setBrightnessUp(percentageStep);
- }
-
- kdDebugFuncOut(trace);
- return retval;
-}
-
-//! dcop function to set the brightness down
-bool kpowersave::do_brightnessDown(int percentageStep) {
- kdDebugFuncIn(trace);
-
- bool retval = false;
-
- if(hwinfo->isOnline()) {
- retval = hwinfo->setBrightnessDown(percentageStep);
- }
-
- kdDebugFuncOut(trace);
- return retval;
-}
-
-
-/*!
- * DCOP Interface funtion to stop/start the Autosuspend
- * \param disable boolean which tell if the autosuspend should be stopped (true)
- * or started (false).
- */
-void kpowersave::disableAutosuspend( bool disable ){
- kdDebugFuncIn(trace);
-
- if(settings->autoSuspend && settings->autoInactiveActionAfter > 0) {
- if (disable) {
- if ( !contextMenu()->isItemChecked(AUTOSUSPEND_MENU_ID)) {
- autoSuspend->stop();
- contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, true);
- }
- }
- else {
- contextMenu()->setItemChecked(AUTOSUSPEND_MENU_ID, false);
- setAutoSuspend(true);
- }
- }
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * DCOP Interface funtion to open/close the detailed dialog.
- */
-void kpowersave::showDetailedDialog( ){
- kdDebugFuncIn(trace);
-
- if (detailedIsShown) {
- detailedDlg->close();
- delete(detailedDlg);
- closedetaileddialog();
- return;
- }
-
- detailedDlg = new detaileddialog(hwinfo, &fullIcon, settings);
-
- if (detailedDlg) {
- detailedDlg->show();
- detailedIsShown = true;
- }
-
- connect(detailedDlg, TQT_SIGNAL(destroyed()), this, TQT_SLOT(closedetaileddialog()));
-
- kdDebugFuncOut(trace);
-}
-
-/*!
- * DCOP Interface funtion to open the configure dialog.
- * \return boolean with the result of open the dialog
- * \retval false if failed (e.g. D-Bus or HAL is not running)
- * \retval true if correct opend
- */
-bool kpowersave::openConfigureDialog (){
- kdDebugFuncIn(trace);
-
- if(hwinfo->isOnline()) {
- showConfigureDialog();
- kdDebugFuncOut(trace);
- return config_dialog_shown;
- } else {
- kdDebugFuncOut(trace);
- return false;
- }
-}
-
-/*!
- * DCOP Interface funtion to find out if the current
- * scheme manages DPMS
- * \return boolean
- * \retval false if current scheme does not overwrite DPMS
- * \retval true if current scheme does
- */
-bool kpowersave::currentSchemeManagesDPMS () {
- kdDebugFuncIn(trace);
-
- return settings->specPMSettings;
-
- kdDebugFuncOut(trace);
-}
-
-
-//! dcop funtion to get the current brightness level
-int kpowersave::brightnessGet() {
- kdDebugFuncIn(trace);
-
- int retval = -1;
-
- if (hwinfo->supportBrightness()) {
- retval = (int)(((float)hwinfo->getCurrentBrightnessLevel() / (float)hwinfo->getMaxBrightnessLevel()-1) * 100.0);
- }
-
- kdDebugFuncOut(trace);
-
- return retval;
-}
-
-#include "kpowersave.moc"