2 // C++ Implementation: powermanager
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
6 // Copyright: See COPYING file that comes with this distribution
9 #include "powermanager.h"
12 #include "batteryicon.h"
13 #include "qtimermessagebox.h"
18 CPowerManager::CPowerManager(QObject
* parent
) :
22 // m_RelativeCapacity(100),
24 m_CriticalHandled(false),
25 m_SettingsFile(UI_FILE_CONFIG
, QSettings::IniFormat
, this)
28 m_ContextMenu
.addAction(tr("&Settings"), this, SLOT(showSettings()))->setEnabled(CBatteryIcon::sysfsDir
.exists());
29 m_ContextMenu
.addAction(tr("&About"), this, SLOT(showAbout()));
30 m_ContextMenu
.addSeparator();
31 m_ContextMenu
.addAction(tr("&Quit"), qApp
, SLOT(quit()));
33 m_DefaultIcon
= new CBatteryIcon(&m_Settings
, tr("merged"), this);
34 m_DefaultIcon
->setContextMenu(&m_ContextMenu
);
36 if (CBatteryIcon::sysfsDir
.exists()) {
37 m_DataTimer
= startTimer(15000);
38 m_Timer
= startTimer(m_Settings
.pollingRate
);
43 CPowerManager::~CPowerManager() {
45 killTimer(m_DataTimer
);
49 inline void CPowerManager::readSettings() {
50 m_SettingsFile
.beginGroup("Main");
51 m_Settings
.pollingRate
= m_SettingsFile
.value("pollingRate", 3000).toUInt();
52 m_Settings
.showBalloon
= m_SettingsFile
.value("showBalloon", false).toBool();
53 m_SettingsFile
.endGroup();
55 m_SettingsFile
.beginGroup("TrayIcons");
56 m_Settings
.mergeBatteries
= m_SettingsFile
.value("mergeBatteries", false).toBool();
57 m_Settings
.colors
[UI_COLOR_PEN
] = m_SettingsFile
.value("textColor", 0).toUInt();
58 m_Settings
.colors
[UI_COLOR_PEN_FULL
] = m_SettingsFile
.value("textFullColor", 0).toUInt();
59 m_Settings
.colors
[UI_COLOR_BRUSH_CHARGED
] = m_SettingsFile
.value("mainChargedColor", qRgb( 0, 255, 0)).toUInt();
60 m_Settings
.colors
[UI_COLOR_BRUSH_EMPTY
] = m_SettingsFile
.value("mainEmptyColor", qRgb(255, 255, 255)).toUInt();
61 m_Settings
.colors
[UI_COLOR_BRUSH_FULL
] = m_SettingsFile
.value("mainFullColor", m_Settings
.colors
[UI_COLOR_BRUSH_CHARGED
]).toUInt();
62 m_Settings
.colors
[UI_COLOR_BRUSH_POLE
] = m_SettingsFile
.value("poleColor", qRgb(255, 255, 0)).toUInt();
63 m_Settings
.colors
[UI_COLOR_BRUSH_POLE_FULL
] = m_SettingsFile
.value("poleFullColor", m_Settings
.colors
[UI_COLOR_BRUSH_POLE
]).toUInt();
64 m_SettingsFile
.endGroup();
66 m_SettingsFile
.beginGroup("CriticalEvent");
67 m_Settings
.handleCritical
= m_SettingsFile
.value("handle", false).toBool();
68 m_Settings
.criticalCapacity
= m_SettingsFile
.value("criticalCapacity", 7).toUInt();
69 m_Settings
.executeCommand
= m_SettingsFile
.value("executeCommand", false).toBool();
70 m_Settings
.criticalCommand
= m_SettingsFile
.value("command", "").toString();
71 m_Settings
.confirmCommand
= m_SettingsFile
.value("confirmCommand", false).toBool();
72 m_Settings
.confirmWithTimeout
= m_SettingsFile
.value("confirmWithTimeout", false).toBool();
73 m_Settings
.timeoutValue
= m_SettingsFile
.value("timeoutValue", 5).toUInt();
74 m_SettingsFile
.endGroup();
77 inline void CPowerManager::writeSettings() {
78 m_SettingsFile
.beginGroup("Main");
79 m_SettingsFile
.setValue("pollingRate", m_Settings
.pollingRate
);
80 m_SettingsFile
.setValue("showBalloon", m_Settings
.showBalloon
);
81 m_SettingsFile
.endGroup();
83 m_SettingsFile
.beginGroup("TrayIcons");
84 m_SettingsFile
.setValue("mergeBatteries", m_Settings
.mergeBatteries
);
85 m_SettingsFile
.setValue("textColor", m_Settings
.colors
[UI_COLOR_PEN
]);
86 m_SettingsFile
.setValue("textFullColor", m_Settings
.colors
[UI_COLOR_PEN_FULL
]);
87 m_SettingsFile
.setValue("mainChargedColor", m_Settings
.colors
[UI_COLOR_BRUSH_CHARGED
]);
88 m_SettingsFile
.setValue("mainEmptyColor", m_Settings
.colors
[UI_COLOR_BRUSH_EMPTY
]);
89 m_SettingsFile
.setValue("mainFullColor", m_Settings
.colors
[UI_COLOR_BRUSH_FULL
]);
90 m_SettingsFile
.setValue("poleColor", m_Settings
.colors
[UI_COLOR_BRUSH_POLE
]);
91 m_SettingsFile
.setValue("poleFullColor", m_Settings
.colors
[UI_COLOR_BRUSH_POLE_FULL
]);
92 m_SettingsFile
.endGroup();
94 m_SettingsFile
.beginGroup("CriticalEvent");
95 m_SettingsFile
.setValue("handle", m_Settings
.handleCritical
);
96 m_SettingsFile
.setValue("criticalCapacity", m_Settings
.criticalCapacity
);
97 m_SettingsFile
.setValue("executeCommand", m_Settings
.executeCommand
);
98 m_SettingsFile
.setValue("command", m_Settings
.criticalCommand
);
99 m_SettingsFile
.setValue("confirmCommand", m_Settings
.confirmCommand
);
100 m_SettingsFile
.setValue("confirmWithTimeout", m_Settings
.confirmWithTimeout
);
101 m_SettingsFile
.setValue("timeoutValue", m_Settings
.timeoutValue
);
102 m_SettingsFile
.endGroup();
105 void CPowerManager::timerEvent(QTimerEvent
* event
) {
106 if (event
->timerId() == m_Timer
)
108 else if (event
->timerId() == m_DataTimer
)
112 void CPowerManager::updateSupplies() {
113 if (CBatteryIcon::sysfsDir
.exists()) {
114 bool oldAC
= m_ACPlug
;
117 QStringList powerSupplies
= CBatteryIcon::sysfsDir
.entryList(QDir::Dirs
| QDir::NoDotAndDotDot
);
119 QList
<CBatteryIcon
*> newBatteryIcons
;
120 CBatteryIcon
* currentBatteryIcon
;
122 foreach(QString i
, powerSupplies
) {
123 // this is possibly not very reliable
124 if (CBatteryIcon::sysfsDir
.exists(i
+ "/online")) {
125 if (readIntSysFile(CBatteryIcon::sysfsDir
.filePath(i
+ "/online").toAscii().constData()) == 1) {
127 m_CriticalHandled
= false;
131 if (m_BatteryIcons
.contains(i
)) {
132 currentBatteryIcon
= m_BatteryIcons
.take(i
);
135 // qDebug("new battery: %s", i.toAscii().constData());
136 currentBatteryIcon
= new CBatteryIcon(&m_Settings
, i
, this);
137 currentBatteryIcon
->setContextMenu(&m_ContextMenu
);
138 currentBatteryIcon
->updateData();
139 currentBatteryIcon
->updateIcon();
140 currentBatteryIcon
->updateToolTip();
142 if (!m_Settings
.mergeBatteries
)
143 currentBatteryIcon
->show();
145 m_CriticalHandled
= false;
147 newBatteryIcons
<< currentBatteryIcon
;
151 foreach(CBatteryIcon
* i
, m_BatteryIcons
)
154 m_BatteryIcons
.clear();
156 foreach(CBatteryIcon
* i
, newBatteryIcons
)
157 m_BatteryIcons
.insert(i
->data().name
, i
);
159 if (oldAC
!= m_ACPlug
)
164 if (m_BatteryIcons
.isEmpty()) {
165 if (!m_DefaultIcon
->isVisible()) {
166 m_DefaultIcon
->setVisible(true);
167 m_DefaultIcon
->setIcon(QIcon(UI_ICON_QBAT_SMALL
));
170 m_DefaultIcon
->setToolTip("QBat - " + tr("AC adapter plugged in"));
172 m_DefaultIcon
->setToolTip("QBat - " + tr("AC adapter unplugged"));
176 if (!m_DefaultIcon
->isVisible()) {
177 m_DefaultIcon
->updateData();
178 m_DefaultIcon
->updateIcon();
180 m_DefaultIcon
->setVisible(m_Settings
.mergeBatteries
);
186 m_DefaultIcon
->setToolTip("QBat - " + tr("no information available"));
187 m_DefaultIcon
->setVisible(true);
192 void CPowerManager::updateMergedData() {
193 if (!m_BatteryIcons
.isEmpty()) {
196 int fullCapacity
= 0;
197 int currentCapacity
= 0;
200 foreach (CBatteryIcon
* battery
, m_BatteryIcons
) {
201 if (battery
->data().fullCapacity
) {
202 fullCapacity
+= battery
->data().fullCapacity
;
206 currentCapacity
+= battery
->data().currentCapacity
;
208 if ((!status
) || (battery
->data().status
!= UI_BATTERY_FULL
))
209 status
= battery
->data().status
;
213 fullCapacity
/= fullCount
;
215 currentCapacity
/= m_BatteryIcons
.count();
217 m_DefaultIcon
->updateData(currentCapacity
, fullCapacity
, 0, 0, 0, status
, false);
221 void CPowerManager::checkCritical() {
222 if (m_ACPlug
|| m_CriticalHandled
||
223 m_DefaultIcon
->data().relativeCharge
== -1 || !m_Settings
.handleCritical
||
224 m_DefaultIcon
->data().relativeCharge
> m_Settings
.criticalCapacity
)
227 QString msgTitle
= (m_Settings
.executeCommand
&& m_Settings
.confirmWithTimeout
) ?
228 tr("QBat - critical battery capacity (will automatically choose ok on timeout)"):
229 tr("QBat - critical battery capacity");
230 QString msgText
= (m_Settings
.executeCommand
&& m_Settings
.confirmCommand
) ?
231 tr("WARNING: The attached battery(s) reached the critical mark.\n"
232 "Click cancel and please make sure to save and shut down soon or provide another source of power\n"
234 "Click ok to execute:\n%1").arg(m_Settings
.criticalCommand
) :
235 tr("WARNING: The attached battery(s) reached the critical mark.\n"
236 "Please make sure to save and shut down soon or provide another source of power.");
237 if (m_Settings
.executeCommand
&& (!m_Settings
.confirmCommand
|| (QTimerMessageBox::warning(NULL
, msgTitle
, msgText
,
238 (m_Settings
.confirmWithTimeout
) ? m_Settings
.timeoutValue
: -1, QMessageBox::Ok
| QMessageBox::Cancel
))))
239 QProcess::startDetached(m_Settings
.criticalCommand
);
241 if (m_Settings
.showBalloon
)
242 m_BatteryIcons
.begin().value()->showMessage(msgTitle
, msgText
, QSystemTrayIcon::Warning
, 7000);
244 QMessageBox::warning(NULL
, msgTitle
, msgText
);
246 m_CriticalHandled
= true;
249 void CPowerManager::updateBatteryData() {
250 foreach (CBatteryIcon
* battery
, m_BatteryIcons
)
251 battery
->updateData();
257 void CPowerManager::restartTimer() {
259 m_Timer
= startTimer(m_Settings
.pollingRate
);
260 killTimer(m_DataTimer
);
261 m_DataTimer
= startTimer(15000);
264 void CPowerManager::showSettings() {
267 if (dialog
.execute(&m_Settings
)) {
268 foreach (CBatteryIcon
* i
, m_BatteryIcons
) {
272 m_BatteryIcons
.clear();
273 m_DefaultIcon
->updateData(0, 0, 0, 0, 0, 0, false);
280 void CPowerManager::showAbout() {
281 if (m_Settings
.showBalloon
) {
282 if (m_DefaultIcon
->isVisible())
283 m_DefaultIcon
->showMessage(tr("About QBat"), UI_NAME
+ "\nv" + QString(UI_VERSION
),
284 QSystemTrayIcon::Information
, 4000);
286 m_BatteryIcons
.begin().value()->showMessage(tr("About QBat"), UI_NAME
+ "\nv" + QString(UI_VERSION
),
287 QSystemTrayIcon::Information
, 4000);
290 QMessageBox aboutBox
;
292 aboutBox
.setWindowIcon(QIcon(UI_ICON_QBAT_SMALL
));
293 aboutBox
.setIconPixmap(QPixmap(UI_ICON_QBAT_LARGE
));
294 aboutBox
.setWindowTitle(tr("About QBat"));
295 aboutBox
.setText(UI_NAME
+ "\nv" + QString(UI_VERSION
));
296 aboutBox
.setStandardButtons(QMessageBox::Ok
);