Sophie

Sophie

distrib > Mandriva > 2009.0 > i586 > by-pkgid > 901b66721cd8b67ee1adbc6604574c15 > files > 35

kdebase-3.5.10-6mdv2009.0.src.rpm

diff -p -up kdebase-3.5.9/kcontrol/background/crossfade.h.crossfade-efect kdebase-3.5.9/kcontrol/background/crossfade.h
--- kdebase-3.5.9/kcontrol/background/crossfade.h.crossfade-efect	2008-03-11 09:17:29.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/crossfade.h	2008-03-11 09:17:29.000000000 -0300
@@ -0,0 +1,56 @@
+/* vi: ts=8 sts=4 sw=4
+ * kate: space-indent on; tab-width 8; indent-width 4; indent-mode cstyle;
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef __crossfade_h_Included__
+#define __crossfade_h_Included__
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/Xrender.h>
+#include <kdebug.h>
+#include <unistd.h>
+
+
+
+
+inline QPixmap crossFade(const QPixmap &pix1, const QPixmap &pix2, double r_alpha,
+	                bool sync = false){
+
+    QPixmap pix = QPixmap(1,1,8); 
+    int mw,mh;
+    mw = pix1.width();
+    mh = pix1.height();
+
+    int alpha = 0xffff * (1-r_alpha);
+    
+    XRenderColor clr = { 0, 0, 0, alpha }; 
+    XRenderPictureAttributes pa;
+    pa.repeat = True;
+    Picture pic = XRenderCreatePicture(pix.x11Display(), pix.handle(),
+	    XRenderFindStandardFormat (pix.x11Display(), PictStandardA8),
+	    CPRepeat, &pa);
+    XRenderFillRectangle(pix.x11Display(), PictOpSrc, pic,
+			 &clr, 0, 0, 1, 1);
+    QPixmap dst(pix1);
+    dst.detach();
+    XRenderComposite(pix.x11Display(), PictOpOver, pix2.x11RenderHandle(),
+	    pic, dst.x11RenderHandle(),0,0, 0,0, 0,0, mw,mh);
+
+    if (sync)
+       XSync(pix.x11Display(), false);	
+    XRenderFreePicture(pix.x11Display(), pic);
+    return dst;
+}
+
+#endif // __crossfade_h_Included__
diff -p -up kdebase-3.5.9/kcontrol/background/Makefile.am.crossfade-efect kdebase-3.5.9/kcontrol/background/Makefile.am
--- kdebase-3.5.9/kcontrol/background/Makefile.am.crossfade-efect	2006-03-17 07:17:11.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/Makefile.am	2008-03-11 09:17:29.000000000 -0300
@@ -12,10 +12,12 @@ METASOURCES = AUTO
 
 noinst_HEADERS = main.h \
  bgrender.h bgsettings.h \
- bgdialog.h bgadvanced.h bgwallpaper.h bgdefaults.h bgmonitor.h
+ bgdialog.h bgadvanced.h bgwallpaper.h bgdefaults.h bgmonitor.h \
+ KCrossBGRender.h crossfade.h
 
 noinst_LTLIBRARIES = libbgnd.la libkcmbgnd.la
-libbgnd_la_SOURCES = bgrender.cpp bgsettings.cpp
+libbgnd_la_SOURCES = bgrender.cpp bgsettings.cpp \
+		     KCrossBGRender.cc
 libkcmbgnd_la_SOURCES = bgdialog.cpp bgdialog_ui.ui bgwallpaper_ui.ui \
                 bgwallpaper.cpp bgadvanced_ui.ui bgadvanced.cpp bgmonitor.cpp
 
diff -p -up kdebase-3.5.9/kcontrol/background/bgrender.cpp.crossfade-efect kdebase-3.5.9/kcontrol/background/bgrender.cpp
--- kdebase-3.5.9/kcontrol/background/bgrender.cpp.crossfade-efect	2007-10-08 06:51:10.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/bgrender.cpp	2008-03-11 09:17:29.000000000 -0300
@@ -44,6 +44,7 @@
 
 #include <config.h>
 
+#include "KCrossBGRender.h"
 /**** KBackgroundRenderer ****/
 
 
@@ -1063,7 +1064,7 @@ KVirtualBGRenderer::~KVirtualBGRenderer(
 }
 
     
-KBackgroundRenderer * KVirtualBGRenderer::renderer(unsigned screen)
+KCrossBGRender * KVirtualBGRenderer::renderer(unsigned screen)
 {
     return m_renderer[screen];
 }
@@ -1224,7 +1225,8 @@ void KVirtualBGRenderer::initRenderers()
     for (unsigned i=0; i<m_numRenderers; ++i)
     {
         int eScreen = m_bCommonScreen ? 0 : i;
-        KBackgroundRenderer * r = new KBackgroundRenderer( m_desk, eScreen, m_bDrawBackgroundPerScreen, m_pConfig );
+        //KBackgroundRenderer * r = new KBackgroundRenderer( m_desk, eScreen, m_bDrawBackgroundPerScreen, m_pConfig );
+	KCrossBGRender *r = new KCrossBGRender(m_desk, eScreen, m_bDrawBackgroundPerScreen, m_pConfig);
         m_renderer.insert( i, r );
         r->setSize(renderSize(i));
         connect( r, SIGNAL(imageDone(int,int)), this, SLOT(screenDone(int,int)) );
@@ -1254,7 +1256,8 @@ void KVirtualBGRenderer::screenDone(int 
     Q_UNUSED(_desk);
     Q_UNUSED(_screen);
     
-    const KBackgroundRenderer * sender = dynamic_cast<const KBackgroundRenderer*>(this->sender());
+    //const KBackgroundRenderer * sender = dynamic_cast<const KBackgroundRenderer*>(this->sender());
+    const KCrossBGRender * sender = dynamic_cast<const KCrossBGRender*>(this->sender());
     int screen = m_renderer.find(sender);
     if (screen == -1)
         //??
diff -p -up kdebase-3.5.9/kcontrol/background/KCrossBGRender.h.crossfade-efect kdebase-3.5.9/kcontrol/background/KCrossBGRender.h
--- kdebase-3.5.9/kcontrol/background/KCrossBGRender.h.crossfade-efect	2008-03-11 09:17:29.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/KCrossBGRender.h	2008-03-11 10:50:24.000000000 -0300
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008 Danilo Cesar Lemes de Paula <danilo@mandriva.com>
+ * Copyright (C) 2008 Gustavo Boiko <boiko@mandriva.com>
+ * Mandriva Conectiva
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+*/
+
+#ifndef __KCrossBGRender_h_Included__
+#define __KCrossBGRender_h_Included__
+
+
+#include <qvaluelist.h>
+#include <qpixmap.h>
+#include <qvaluelist.h>
+#include <qdatetime.h>
+
+#include "bgrender.h"
+
+class QDomElement;
+
+typedef struct crossEvent{
+	bool transition;
+	QString pix1;
+	QString pix2;
+	QTime stime; //start time
+	QTime etime; //end time
+} KBGCrossEvent;
+
+
+class KCrossBGRender: public KBackgroundRenderer{
+	
+Q_OBJECT
+
+public:
+	KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config=0);
+	~KCrossBGRender();
+
+	bool needWallpaperChange();
+	void changeWallpaper(bool init=false);
+	QPixmap pixmap();
+	bool usingCrossXml(){return useCrossEfect;};
+
+
+private:
+	QPixmap pix;
+	int secs;
+	QString xmlFileName;
+	bool useCrossEfect;
+	
+	int actualPhase;
+	 
+	void createStartTime(QDomElement e);
+	void createTransition(QDomElement e);
+	void createStatic(QDomElement e);
+	bool setCurrentEvent(bool init = false);
+	void initCrossFade(QString xml);
+	void fixEnabled();
+	QPixmap getCurrentPixmap();
+	KBGCrossEvent current;
+	QValueList<KBGCrossEvent> timeList;
+};
+
+#endif // __KCrossBGRender_h_Included__ 
diff -p -up kdebase-3.5.9/kcontrol/background/bgrender.h.crossfade-efect kdebase-3.5.9/kcontrol/background/bgrender.h
--- kdebase-3.5.9/kcontrol/background/bgrender.h.crossfade-efect	2006-10-01 14:31:47.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/bgrender.h	2008-03-11 09:17:29.000000000 -0300
@@ -28,6 +28,7 @@ class KProcess;
 class KTempFile;
 class KShellProcess;
 class KStandardDirs;
+class KCrossBGRender;
 
 /**
  * This class renders a desktop background to a QImage. The operation is
@@ -127,7 +128,7 @@ public:
     KVirtualBGRenderer(int desk, KConfig *config=0l);
     ~KVirtualBGRenderer();
     
-    KBackgroundRenderer * renderer(unsigned screen);
+    KCrossBGRender * renderer(unsigned screen);
     unsigned numRenderers() const { return m_numRenderers; }
 
     QPixmap pixmap();
@@ -173,7 +174,8 @@ private:
     QSize m_size;
     
     QMemArray<bool> m_bFinished;
-    QPtrVector<KBackgroundRenderer> m_renderer;
+    //QPtrVector<KBackgroundRenderer> m_renderer;
+    QPtrVector<KCrossBGRender> m_renderer;
     QPixmap *m_pPixmap;
 };
 
diff -p -up kdebase-3.5.9/kcontrol/background/KCrossBGRender.cc.crossfade-efect kdebase-3.5.9/kcontrol/background/KCrossBGRender.cc
--- kdebase-3.5.9/kcontrol/background/KCrossBGRender.cc.crossfade-efect	2008-03-11 09:17:29.000000000 -0300
+++ kdebase-3.5.9/kcontrol/background/KCrossBGRender.cc	2008-03-11 10:54:41.000000000 -0300
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2008 Danilo Cesar Lemes de Paula <danilo@mandriva.com>
+ * Copyright (C) 2008 Gustavo Boiko <boiko@mandriva.com>
+ * Mandriva Conectiva
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <qdom.h>
+#include <qfile.h>
+
+#include <kdebug.h>
+
+#include "KCrossBGRender.h"
+//#include "crossfade.h"
+#include <qapplication.h>
+#include <kimageeffect.h>
+
+
+KCrossBGRender::KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config): KBackgroundRenderer(desk,screen,drawBackgroundPerScreen,config)
+{
+	useCrossEfect = false;
+	if ( wallpaperList()[0].endsWith("xml",false) ){
+		initCrossFade(wallpaperList()[0]);
+	}
+		
+}
+
+void KCrossBGRender::initCrossFade(QString xmlFile){
+	
+	useCrossEfect = true;
+	if (xmlFile.isEmpty()){
+		useCrossEfect = false;
+		return;
+	}
+	secs = 0;
+	timeList.empty();
+
+	// read the XMLfile
+	QDomDocument xmldoc = QDomDocument(xmlFile);
+	QFile file( xmlFile );
+	if ( !file.open( IO_ReadOnly ) ){
+		useCrossEfect = false;
+		return;
+	}
+	if ( !xmldoc.setContent( &file ) ) {
+		useCrossEfect = false;
+		file.close();
+		return;
+	}
+	file.close();
+
+	QDomElement docElem = xmldoc.documentElement();
+	QDomNode n = docElem.firstChild();
+	while( !n.isNull() ) {
+        	QDomElement e = n.toElement(); // try to convert the node to an element.
+		if( !e.isNull() ) {
+			if (e.tagName() == "starttime"){
+				createStartTime(e);	
+				
+			}else if (e.tagName() == "transition"){
+				createTransition(e);
+			}else if (e.tagName() == "static"){
+				createStatic(e);
+			}
+		}
+		n = n.nextSibling();
+	}
+
+	// Setting "now" state
+	setCurrentEvent(true);
+	pix = getCurrentPixmap();
+	
+	useCrossEfect = true;
+}
+
+
+KCrossBGRender::~KCrossBGRender(){
+}
+
+QPixmap KCrossBGRender::pixmap(){
+
+	fixEnabled();	
+	if (!useCrossEfect)
+		return KBackgroundRenderer::pixmap();
+	
+	return pix;
+}
+
+bool KCrossBGRender::needWallpaperChange(){
+
+
+	if (!useCrossEfect)
+		return KBackgroundRenderer::needWallpaperChange();
+
+	bool forceChange = setCurrentEvent();    // If we change the current state
+	if (forceChange){			 // do not matter what hapens
+		actualPhase = 0;                 // we need to change background
+		return true;
+	}
+
+	// Return false if it's not a transition
+	if (!current.transition)
+		return false;
+
+	double timeLeft, timeTotal;
+	QTime now = QTime::currentTime();
+
+	timeLeft = now.secsTo(current.etime);
+	if (timeLeft < 0)
+		timeLeft += 86400; // before midnight
+	timeTotal = current.stime.secsTo(current.etime);
+	if (timeTotal < 0)
+		timeTotal += 86400;
+
+	double passed  = timeTotal - timeLeft;
+	double timeCell   =  timeTotal/60; //Time cell size
+
+	//kdDebug() << "\ntimeleft:" << timeLeft << " timeTotal:" << timeTotal 
+	//          << "\npassed:" << passed << " timeCell:" << timeCell
+	//	  << "\nactualPhase: " << actualPhase << endl;	
+
+	int aux = passed/timeCell;	
+	if(actualPhase != aux){
+		//kdDebug() << "needWallpaperChange() => returned true" << endl;
+		actualPhase = passed/timeCell;
+		return true;
+	}
+
+	//kdDebug() << "needWallpaperChange() => returned false" << endl;
+	return false;
+
+}
+
+/* 
+ * This method change the enabledEffect flag to TRUE of FLASE, acording 
+ * with multiWallpaperMode and FileName (it needs to be a XML)
+ */
+void KCrossBGRender::fixEnabled(){
+
+	
+	QString w = wallpaperList()[0];
+	useCrossEfect = false;	
+	if(multiWallpaperMode() == Random || multiWallpaperMode() == InOrder){
+		
+		if ( w != xmlFileName ){
+			// New XML File
+			xmlFileName = w;
+			if (w.endsWith("xml",false)){
+				initCrossFade(wallpaperList()[0]);
+				//useCrossEfect = true;	
+			}else{
+				// Not, it's not a xml file
+				useCrossEfect = false;
+			}
+		}else if (w.endsWith("xml",false)){
+			//xmlFile doesn't change
+			//but it's there
+			useCrossEfect = true;
+		}else{
+			// it's not a XML file
+			useCrossEfect = false;
+		}
+	}
+}
+
+void KCrossBGRender::changeWallpaper(bool init){
+
+
+
+	fixEnabled();
+
+	if (!useCrossEfect){
+		KBackgroundRenderer::changeWallpaper(init);
+		return;
+	}
+
+	pix = getCurrentPixmap();
+
+
+}
+
+
+bool KCrossBGRender::setCurrentEvent(bool init){
+	QTime now = QTime::currentTime();
+	
+
+	//Verify if is need to change
+	if (!(init || now <= current.stime || now >= current.etime ))
+		return false;
+
+	QValueList<KBGCrossEvent>::iterator it;
+	for ( it = timeList.begin(); it != timeList.end(); ++it ){
+
+		// Look for time
+		if ( ((*it).stime <= now && now <= (*it).etime) ||   //normal situation
+		     ((*it).etime <= (*it).stime && (now >= (*it).stime ||
+		     				     now <= (*it).etime) ) )	
+		{
+			current = *it;
+			actualPhase = 0;
+
+			//kdDebug() << "Cur: " << current.stime << "< now <" << current.etime << endl;
+			return true;
+		}
+	}
+}
+
+QPixmap KCrossBGRender::getCurrentPixmap(){
+
+	float alpha;
+	QPixmap ret;
+	QImage tmp;
+	QImage p1;
+	if (!tmp.load(current.pix1))
+		return QPixmap();
+
+	// scale the pixmap to fit in the screen
+	//p1 = QPixmap(QApplication::desktop()->screenGeometry().size());
+	//QPainter p(&p1);
+	//p.drawPixmap(p1.rect(), tmp);
+	//
+	p1 = tmp.smoothScale(QApplication::desktop()->screenGeometry().size());
+
+	if (current.transition){
+		QTime now = QTime::currentTime();
+		double timeLeft,timeTotal;
+
+		QImage p2;
+
+		if (!tmp.load(current.pix2) )
+			return NULL;
+
+		p2 = tmp.smoothScale(QApplication::desktop()->screenGeometry().size());
+		//QPainter p(&p2);
+		//p.drawPixmap(p2.rect(), tmp);
+
+		timeLeft = now.secsTo(current.etime);
+		if (timeLeft < 0)
+			timeLeft += 86400;
+		timeTotal = current.stime.secsTo(current.etime);
+		if (timeTotal < 0)
+			timeTotal += 86400;
+		
+		alpha = (timeTotal - timeLeft)/timeTotal;
+
+		//ret = crossFade(p2,p1,alpha);
+		tmp = KImageEffect::blend(p2,p1,alpha);
+		ret.convertFromImage(tmp);
+		return ret;
+	}else{
+		ret.convertFromImage(p1);
+		return ret;
+	}	
+	
+
+}
+
+void KCrossBGRender::createStartTime(QDomElement docElem){
+	
+	int hour;
+	int minutes;
+
+	QDomNode n = docElem.firstChild();
+	while( !n.isNull() ) {
+		QDomElement e = n.toElement();
+		if( !e.isNull() ) {
+			if (e.tagName() == "hour"){
+				hour =  e.text().toInt();
+			}else if ( e.tagName() == "minute" ){
+				minutes = e.text().toInt();
+			}
+			
+		}
+		
+		n = n.nextSibling();
+	}
+	secs = hour*60*60 + minutes*60;
+}
+void KCrossBGRender::createTransition(QDomElement docElem){
+
+	int duration;
+	QString from;
+	QString to;
+
+	QDomNode n = docElem.firstChild();
+	while( !n.isNull() ) {
+		QDomElement e = n.toElement();
+		if( !e.isNull() ) {
+			if (e.tagName() == "duration"){
+				duration = e.text().toFloat();
+			}else if ( e.tagName() == "from" ){
+				from = e.text();
+			}
+			else if ( e.tagName() == "to" ){
+				to = e.text();
+			}
+			
+		}
+		n = n.nextSibling();
+	}
+	QTime startTime(0,0,0);
+	startTime = startTime.addSecs(secs);
+	QTime endTime(0,0,0);
+	endTime = endTime.addSecs(secs+duration);
+
+	secs += duration;
+	
+	KBGCrossEvent l = {true, from, to, startTime,endTime};
+
+	timeList.append(l);
+
+}
+void KCrossBGRender::createStatic(QDomElement docElem){
+	
+	int duration;
+	QString file;
+	
+	QDomNode n = docElem.firstChild();
+	while( !n.isNull() ) {
+		QDomElement e = n.toElement();
+		if( !e.isNull() ) {
+			if (e.tagName() == "duration"){
+				duration = e.text().toFloat();
+			}else if ( e.tagName() == "file" ){
+				file = e.text();
+			}
+			
+		}
+		n = n.nextSibling();
+	}
+	
+	QTime startTime(0,0,0);
+	startTime = startTime.addSecs(secs);
+	QTime endTime(0,0,0);
+	endTime = endTime.addSecs(secs+duration);
+	
+	secs += duration;
+
+	KBGCrossEvent l = {false, file, NULL, startTime,endTime};
+	timeList.append(l);
+}
+
+#include "KCrossBGRender.moc"
diff -p -up kdebase-3.5.9/kdm/kfrontend/krootimage.h.crossfade-efect kdebase-3.5.9/kdm/kfrontend/krootimage.h
--- kdebase-3.5.9/kdm/kfrontend/krootimage.h.crossfade-efect	2005-10-10 12:04:31.000000000 -0300
+++ kdebase-3.5.9/kdm/kfrontend/krootimage.h	2008-03-11 09:17:29.000000000 -0300
@@ -27,6 +27,7 @@ Boston, MA 02110-1301, USA.
 #include <qtimer.h>
 
 #include <bgrender.h>
+#include <KCrossBGRender.h>
 
 
 class MyApplication : public KApplication
diff -p -up kdebase-3.5.9/kdesktop/Makefile.am.crossfade-efect kdebase-3.5.9/kdesktop/Makefile.am
--- kdebase-3.5.9/kdesktop/Makefile.am.crossfade-efect	2006-05-22 15:12:51.000000000 -0300
+++ kdebase-3.5.9/kdesktop/Makefile.am	2008-03-11 09:17:29.000000000 -0300
@@ -23,13 +23,13 @@ kdesktop_la_SOURCES = main.cc krootwm.cc
 	minicli.cpp KBackgroundIface.skel pixmapserver.cc kcustommenu.cc \
 	startupid.cpp minicli_ui.ui xautolock_diy.c xautolock_engine.c \
 	kshadowengine.cpp kshadowsettings.cpp \
-	kdesktopshadowsettings.cpp kfileividesktop.cpp
+	kdesktopshadowsettings.cpp kfileividesktop.cpp 
 
 include_HEADERS = KDesktopIface.h KScreensaverIface.h KBackgroundIface.h
 
 noinst_HEADERS = desktop.h bgmanager.h krootwm.h \
 	xautolock.h lockeng.h init.h minicli.h \
-	pixmapserver.h startupid.h xautolock_c.h
+	pixmapserver.h startupid.h xautolock_c.h 	
 
 kcheckrunning_SOURCES = kcheckrunning.cpp
 kcheckrunning_LDFLAGS = $(all_libraries)
diff -p -up kdebase-3.5.9/kdesktop/bgmanager.cc.crossfade-efect kdebase-3.5.9/kdesktop/bgmanager.cc
--- kdebase-3.5.9/kdesktop/bgmanager.cc.crossfade-efect	2007-01-15 09:32:10.000000000 -0200
+++ kdebase-3.5.9/kdesktop/bgmanager.cc	2008-03-11 10:51:28.000000000 -0300
@@ -15,10 +15,16 @@
 #include "kdesktopsettings.h"
 #include "bgsettings.h"
 
+//FIXME
+#include "KCrossBGRender.h"
+#include "crossfade.h"
+
 #include <assert.h>
 
 #include <qtimer.h>
 #include <qscrollview.h>
+#include <qpainter.h>
+#include <qdesktopwidget.h>
 
 #include <kiconloader.h>
 #include <kconfig.h>
@@ -33,6 +39,8 @@
 #include <X11/X.h>
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
+#include <X11/extensions/Xrender.h>
+#include <unistd.h>
 
 #ifndef None
 #define None 0L
@@ -40,7 +48,8 @@
 
 #include "pixmapserver.h"
 
-template class QPtrVector<KBackgroundRenderer>;
+//template class QPtrVector<KBackgroundRenderer>;
+template class QPtrVector<KCrossBGRender>;
 template class QPtrVector<KBackgroundCacheEntry>;
 template class QMemArray<int>;
 
@@ -80,6 +89,7 @@ KBackgroundManager::KBackgroundManager(Q
         m_Cache[i]->pixmap = 0L;
         m_Cache[i]->hash = 0;
         m_Cache[i]->exp_from = -1;
+
         m_Renderer.insert (i, new KVirtualBGRenderer(i,m_pConfig));
         connect(m_Renderer[i], SIGNAL(imageDone(int)), SLOT(slotImageDone(int)));
         m_Renderer[i]->enableTiling( true ); // optimize
@@ -91,6 +101,11 @@ KBackgroundManager::KBackgroundManager(Q
     connect(m_pTimer, SIGNAL(timeout()), SLOT(slotTimeout()));
     m_pTimer->start( 60000 );
 
+    /*CrossFade's config*/
+    m_crossTimer = new QTimer(this);
+    connect(m_crossTimer, SIGNAL(timeout()), SLOT(slotCrossFadeTimeout()));
+
+    /*Ends here*/
     connect(m_pKwinmodule, SIGNAL(currentDesktopChanged(int)),
 	    SLOT(slotChangeDesktop(int)));
     connect(m_pKwinmodule, SIGNAL(numberOfDesktopsChanged(int)),
@@ -406,23 +421,97 @@ void KBackgroundManager::renderBackgroun
     r->start();
 }
 
+/*
+ * This slot is called when the Timeout is executed
+ */
+void KBackgroundManager::slotCrossFadeTimeout(){
+
+    KVirtualBGRenderer *r = m_Renderer[fadeDesk];
+
+    if (crossInit){
+	mBenchmark.start();
+    }
+
+    if (mAlpha <= 0.0 || mBenchmark.elapsed() > 300 ){
+	bool do_cleanup = true;
+	mAlpha = 1;
+	m_crossTimer->stop();
+	KPixmap pixm(mNextScreen);
+	setPixmap(&pixm, r->hash(), fadeDesk);
+	return;
+    }
+    // Reset Timer
+    mBenchmark.start();
+
+    QPixmap dst = crossFade(*mOldScreen, mNextScreen, mAlpha, crossInit);
+    KPixmap pixm(dst);
+    setPixmap(&pixm, r->hash(), fadeDesk);
+
+    mAlpha -=0.03;
+    crossInit = false;
+}
 
 /*
  * This slot is called when a renderer is done.
  */
 void KBackgroundManager::slotImageDone(int desk)
 {
+
     KPixmap *pm = new KPixmap();
     KVirtualBGRenderer *r = m_Renderer[desk];
     bool do_cleanup = true;
+    fadeDesk = desk; 
+    mAlpha = 1.0;
+    int width,height;
 
     *pm = r->pixmap();
     // If current: paint it
+    
     bool current = (r->hash() == m_Renderer[effectiveDesktop()]->hash());
     if (current)
     {
-        setPixmap(pm, r->hash(), desk);
-        if (!m_bBgInitDone)
+
+	//START
+	
+	if (!m_Renderer[effectiveDesktop()]->renderer(0)->usingCrossXml()){		
+	    int mode = m_Renderer[effectiveDesktop()]->renderer(0)->wallpaperMode();
+	    width = QApplication::desktop()->screenGeometry().width(); //m_pDesktop->width();
+	    height = QApplication::desktop()->screenGeometry().height();// m_pDesktop->height(); 	
+	
+
+	    if (mode == KBackgroundSettings::NoWallpaper || mode == KBackgroundSettings::Tiled || mode  == KBackgroundSettings::CenterTiled ){
+		mNextScreen = QPixmap(width,height);
+		QPainter p (&mNextScreen);
+		p.drawTiledPixmap(0,0,width,height,*pm);	    
+	    } 
+	    else{
+		mNextScreen = QPixmap(*pm);
+	    }
+	
+
+	    if (m_pDesktop){
+		mOldScreen = const_cast<QPixmap *>( m_pDesktop->backgroundPixmap() );
+	    }else{
+		mOldScreen = const_cast<QPixmap *>(
+				     QApplication::desktop()->screen()->backgroundPixmap() );
+	    }
+
+	    //TODO Find a way to discover if CrossFade effect needs to run	
+	    if (mOldScreen){
+		crossInit = true;
+		m_crossTimer->start(70);
+	    }
+	    else{
+		setPixmap(pm, r->hash(), desk);
+	    }
+	}else{
+	    setPixmap(pm, r->hash(), desk);
+	}
+		//ENDS HERE  */
+		
+	//setPixmap(pm, r->hash(), desk);
+        
+	if (!m_bBgInitDone)
         {
             m_bBgInitDone = true;
             emit initDone();
@@ -430,11 +519,12 @@ void KBackgroundManager::slotImageDone(i
             do_cleanup = false;
         }
     }
+    
     if (m_bExport || !m_bCommon)
 	addCache(pm, r->hash(), desk);
     else
         delete pm;
-
+    
     if (current)
         exportBackground(desk, realDesktop());
 
@@ -443,6 +533,7 @@ void KBackgroundManager::slotImageDone(i
         r->saveCacheFile();
         r->cleanup();
     }
+
 }
 
 
@@ -618,7 +709,7 @@ int KBackgroundManager::validateDesk(int
 QString KBackgroundManager::currentWallpaper(int desk)
 {
     //TODO Is the behaviour of this function appropriate for multiple screens?
-    KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0);
+    KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0);
 
     return r->currentWallpaper();
 }
@@ -635,7 +726,6 @@ void KBackgroundManager::changeWallpaper
 // DCOP exported
 void KBackgroundManager::setExport(int _export)
 {
-    kdDebug() << "KBackgroundManager enabling exports.\n";
     applyExport(_export);
     slotChangeDesktop(0);
 }
@@ -660,7 +750,7 @@ void KBackgroundManager::setWallpaper(QS
     //TODO Is the behaviour of this function appropriate for multiple screens?
     for (unsigned i=0; i < m_Renderer[effectiveDesktop()]->numRenderers(); ++i)
     {
-        KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(i);
+        KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(i);
         r->stop();
         r->setWallpaperMode(mode);
         r->setMultiWallpaperMode(KBackgroundSettings::NoMulti);
@@ -672,8 +762,9 @@ void KBackgroundManager::setWallpaper(QS
 
 void KBackgroundManager::setWallpaper(QString wallpaper)
 {
+
     //TODO Is the behaviour of this function appropriate for multiple screens?
-    KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(0);
+    KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(0);
     int mode = r->wallpaperMode();
     if (mode == KBackgroundSettings::NoWallpaper)
        mode = KBackgroundSettings::Tiled;
@@ -686,7 +777,7 @@ void KBackgroundManager::setWallpaper(QS
 QStringList KBackgroundManager::wallpaperFiles(int desk)
 {
     //TODO Is the behaviour of this function appropriate for multiple screens?
-    KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0);
+    KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0);
 
     return r->wallpaperFiles();
 }
@@ -697,7 +788,7 @@ QStringList KBackgroundManager::wallpape
 QStringList KBackgroundManager::wallpaperList(int desk)
 {
     //TODO Is the behaviour of this function appropriate for multiple screens?
-    KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0);;
+    KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0);;
 
     return r->wallpaperList();
 }
@@ -724,7 +815,7 @@ void KBackgroundManager::setWallpaper(in
     //TODO Is the behaviour of this function appropriate for multiple screens?
     for (unsigned i=0; i < m_Renderer[sdesk]->numRenderers(); ++i)
     {
-        KBackgroundRenderer *r = m_Renderer[sdesk]->renderer(i);
+        KCrossBGRender *r = m_Renderer[sdesk]->renderer(i);
     
         setCommon(false);   // Force each desktop to have it's own wallpaper
     
@@ -769,7 +860,7 @@ void KBackgroundManager::setColor(const 
     //TODO Is the behaviour of this function appropriate for multiple screens?
     for (unsigned i=0; i < m_Renderer[effectiveDesktop()]->numRenderers(); ++i)
     {
-        KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(i);
+        KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(i);
         r->stop();
     
         if (isColorA)
@@ -806,6 +897,6 @@ void KBackgroundManager::setBackgroundEn
       m_Renderer[i]->setEnabled(enable);
     }
   slotChangeDesktop(0);
-}
+} 
 
 #include "bgmanager.moc"
diff -p -up kdebase-3.5.9/kdesktop/bgmanager.h.crossfade-efect kdebase-3.5.9/kdesktop/bgmanager.h
--- kdebase-3.5.9/kdesktop/bgmanager.h.crossfade-efect	2006-10-01 14:32:02.000000000 -0300
+++ kdebase-3.5.9/kdesktop/bgmanager.h	2008-03-11 09:17:29.000000000 -0300
@@ -12,7 +12,7 @@
 
 #include <qstring.h>
 #include <qptrvector.h>
-
+#include <qdatetime.h>
 #include <KBackgroundIface.h>
 
 class KConfig;
@@ -83,6 +83,7 @@ private slots:
     void desktopResized();
     void clearRoot();
     void saveImages();
+    void slotCrossFadeTimeout();
     
 private:
     void applyCommon(bool common);
@@ -113,6 +114,7 @@ private:
     KConfig *m_pConfig;
     QWidget *m_pDesktop;
     QTimer *m_pTimer;
+    
 
     QPtrVector<KVirtualBGRenderer> m_Renderer;
     QPtrVector<KBackgroundCacheEntry> m_Cache;
@@ -121,6 +123,15 @@ private:
     KPixmapServer *m_pPixmapServer;
     
     unsigned long m_xrootpmap;
+
+    /*CrossFade vars*/
+    QTimer * m_crossTimer;
+    double mAlpha;
+    QPixmap  mNextScreen;
+    QPixmap  * mOldScreen;
+    int fadeDesk;
+    QTime mBenchmark;
+    bool crossInit;
 };
 
 #endif // __BGManager_h_Included__