Index: Tray-BattInfo/batterytray.cpp
===================================================================
--- Tray-BattInfo/batterytray.cpp	(Revision 454)
+++ Tray-BattInfo/batterytray.cpp	(Revision 920)
@@ -1,7 +1,7 @@
 /* 
  * This file is part of DesktopBSD, see the README file.
  *
- * Author: Peter Hofer <hofer.p@gmail.com>
+ * Author: Peter Hofer <ph@desktopbsd.net>
  *         (C) 2004, 2005
  *
  * Copyright: BSD, see the COPYING file included in this distribution
@@ -26,14 +26,29 @@
 #define _UPDATE_MAX 30
 
 BatteryTray::BatteryTray() {
-	contextMenu()->insertItem(DBSDGlobal::getIconLoader()->loadIcon("configure", DBSDIconLoader::Size16x16),
+	DBSDIconLoader  *iloader = DBSDGlobal::getIconLoader();
+	
+	contextMenu()->insertItem(iloader->loadIcon("configure", DBSDIconLoader::Size16x16),
 	                          tr("Configure..."), this, SLOT(openConfigDialog()));
+	
+	imgBattery = iloader->loadIcon("dbsd-battinfo-battery", DBSDIconLoader::Size22x22)
+							.convertToImage();
+
+	imgRecharge = iloader->loadIcon("dbsd-battinfo-recharge", DBSDIconLoader::Size22x22)
+							.convertToImage();
+	
+	pixPower = iloader->loadIcon("dbsd-battinfo-power", DBSDIconLoader::Size22x22);
+	
+	previousRechargeLife = -1;
+	previousPowerSource = -1;
 }
 
 BatteryTray::~BatteryTray() {
 }
 
-void	BatteryTray::polish() {
+void	BatteryTray::showEvent(QShowEvent *e) {
+	KSystemTray::showEvent(e);
+
 	uint	updateTime = Battery::infoExpires();
 
 	/* Check for bad values and replace
@@ -44,7 +59,7 @@
 	else if(updateTime > _UPDATE_MAX)
 		updateTime = _UPDATE_MAX;
 
-	updateTime = 2;
+	updateStatus();
 
 	timer = new QTimer(this);
 	connect(timer,  SIGNAL(timeout()),  SLOT(updateStatus()));
@@ -53,33 +68,30 @@
 
 
 void  BatteryTray::updateStatus() {
-	DBSDIconLoader  *iloader = DBSDGlobal::getIconLoader();
 	QImage  image;
 	
 	static bool lifeCriticalShown = false,
 					lifeLowShown = false;
 
-	int  acline = Battery::powerSource();
+	int  powersrc = Battery::powerSource();
 	int  time = Battery::getTime();
 	int  life = Battery::getLife();
 
 	QString  tipText = tr("Power Source: %1\n", "The power source of a mobile device");
 
-	if(acline == Battery::PS_ACLine) {
+	if(powersrc == Battery::PS_ACLine) {
 		tipText = tipText.arg(tr("AC Line"));
 
 		if(life >= 0  &&  life  <= 100)
-			image = DBSDGlobal::getIconLoader()->loadIcon("dbsd-battinfo-recharge",
-																		 DBSDIconLoader::Size22x22).convertToImage();
+			image = imgRecharge;
 		else
-			setPixmap(iloader->loadIcon("dbsd-battinfo-power", DBSDIconLoader::Size22x22));
+			setPixmap(pixPower);
 
 		lifeCriticalShown = false;
 		lifeLowShown = false;
 	} else {
 		tipText = tipText.arg(tr("Battery"));
-		image = DBSDGlobal::getIconLoader()->loadIcon("dbsd-battinfo-battery",
-																	 DBSDIconLoader::Size22x22).convertToImage();
+		image = imgBattery;
 
 		if(!lifeCriticalShown) {
 			BatterySettings bs;
@@ -96,23 +108,36 @@
 	}
 
 	if(life >= 0 && life <= 100) {
-		for(uint y = 0;  y < (float) (image.height() - 9) / 100 * (100 - life) + 4;  ++y)
-			for(uint x = 0;  x < image.width();  ++x) {
-				uint rgba = image.pixel(x, y);
+		int rlife = (float) (image.height() - 9) / 100 * (101 - life) + 4;
+		
+		if(rlife != previousRechargeLife || powersrc != previousPowerSource)
+		{
+			image.detach();
 
-				/* Don't change transparent pixels */
-				if(qAlpha(rgba) < 190)
-					continue;
-			
-				QColor c;
-				int h, s ,v;
-				c.setRgb(rgba);
-				c.getHsv(&h, &s, &v);
-				c.setHsv(h, 0, ((v *= 1.1) > 255) ? 255 : v);
-				image.setPixel(x, y, c.rgb());
+			for(uint y = 0;  y < rlife;  ++y)
+			{
+				for(uint x = 0;  x < image.width();  ++x)
+				{
+					uint rgba = image.pixel(x, y);
+	
+					/* Don't change transparent pixels */
+					if(qAlpha(rgba) < 190)
+						continue;
+				
+					QColor c;
+					int h, s ,v;
+					c.setRgb(rgba);
+					c.getHsv(&h, &s, &v);
+					c.setHsv(h, 0, ((v *= 1.1) > 255) ? 255 : v);
+					image.setPixel(x, y, c.rgb());
+				}
 			}
 
-		setPixmap(QPixmap(image));
+			previousPowerSource = powersrc;
+			previousRechargeLife = rlife;
+			pixPreviousRecharge = image;
+			setPixmap(pixPreviousRecharge);
+		}
 
 		tipText += tr("Battery Status: %1 %\n").arg(life);
 	}


syntax highlighted by Code2HTML, v. 0.9.1