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__