parent
e96ee72ff0
commit
db19d360b6
@ -0,0 +1,361 @@
|
|||||||
|
/*
|
||||||
|
* 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 <tqdom.h>
|
||||||
|
#include <tqfile.h>
|
||||||
|
|
||||||
|
#include <kdebug.h>
|
||||||
|
|
||||||
|
#include "KCrossBGRender.h"
|
||||||
|
#include <tqapplication.h>
|
||||||
|
#include <kimageeffect.h>
|
||||||
|
|
||||||
|
|
||||||
|
KCrossBGRender::KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, TDEConfig *config): KBackgroundRenderer(desk,screen,drawBackgroundPerScreen,config)
|
||||||
|
{
|
||||||
|
useCrossEfect = false;
|
||||||
|
if ( wallpaperList()[0].endsWith("xml",false) ) {
|
||||||
|
initCrossFade(wallpaperList()[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void KCrossBGRender::initCrossFade(TQString xmlFile)
|
||||||
|
{
|
||||||
|
useCrossEfect = true;
|
||||||
|
if (xmlFile.isEmpty()){
|
||||||
|
useCrossEfect = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
secs = 0;
|
||||||
|
timeList.empty();
|
||||||
|
|
||||||
|
// read the XMLfile
|
||||||
|
TQDomDocument xmldoc = TQDomDocument(xmlFile);
|
||||||
|
TQFile file( xmlFile );
|
||||||
|
if ( !file.open( IO_ReadOnly ) ) {
|
||||||
|
useCrossEfect = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !xmldoc.setContent( &file ) ) {
|
||||||
|
useCrossEfect = false;
|
||||||
|
file.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
TQDomElement docElem = xmldoc.documentElement();
|
||||||
|
TQDomNode n = docElem.firstChild();
|
||||||
|
while( !n.isNull() ) {
|
||||||
|
TQDomElement 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(){
|
||||||
|
}
|
||||||
|
|
||||||
|
TQPixmap KCrossBGRender::pixmap() {
|
||||||
|
fixEnabled();
|
||||||
|
if (!useCrossEfect){
|
||||||
|
TQPixmap p = KBackgroundRenderer::pixmap();
|
||||||
|
kdDebug() << "Inherited " << p.size() << endl;
|
||||||
|
if (p.width() == 0 && p.height() == 0){
|
||||||
|
p.convertFromImage(image());
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
TQTime now = TQTime::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 FALSE, according
|
||||||
|
* with multiWallpaperMode and FileName (it needs to be a XML)
|
||||||
|
*/
|
||||||
|
void KCrossBGRender::fixEnabled(){
|
||||||
|
|
||||||
|
|
||||||
|
TQString 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){
|
||||||
|
TQTime now = TQTime::currentTime();
|
||||||
|
|
||||||
|
|
||||||
|
//Verify if is need to change
|
||||||
|
if (!(init || now <= current.stime || now >= current.etime )) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TQValueList<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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TQPixmap KCrossBGRender::getCurrentPixmap()
|
||||||
|
{
|
||||||
|
float alpha;
|
||||||
|
TQPixmap ret;
|
||||||
|
TQImage tmp;
|
||||||
|
TQImage p1;
|
||||||
|
if (!tmp.load(current.pix1))
|
||||||
|
return TQPixmap();
|
||||||
|
|
||||||
|
// scale the pixmap to fit in the screen
|
||||||
|
//p1 = TQPixmap(QApplication::desktop()->screenGeometry().size());
|
||||||
|
//TQPainter p(&p1);
|
||||||
|
//p.drawPixmap(p1.rect(), tmp);
|
||||||
|
//
|
||||||
|
p1 = tmp.smoothScale(TQApplication::desktop()->screenGeometry().size());
|
||||||
|
|
||||||
|
if (current.transition){
|
||||||
|
TQTime now = TQTime::currentTime();
|
||||||
|
double timeLeft,timeTotal;
|
||||||
|
|
||||||
|
TQImage p2;
|
||||||
|
|
||||||
|
if (!tmp.load(current.pix2) )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
p2 = tmp.smoothScale(TQApplication::desktop()->screenGeometry().size());
|
||||||
|
//TQPainter 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(TQDomElement docElem)
|
||||||
|
{
|
||||||
|
int hour;
|
||||||
|
int minutes;
|
||||||
|
|
||||||
|
TQDomNode n = docElem.firstChild();
|
||||||
|
while( !n.isNull() ) {
|
||||||
|
TQDomElement 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(TQDomElement docElem)
|
||||||
|
{
|
||||||
|
int duration;
|
||||||
|
TQString from;
|
||||||
|
TQString to;
|
||||||
|
|
||||||
|
TQDomNode n = docElem.firstChild();
|
||||||
|
while( !n.isNull() ) {
|
||||||
|
TQDomElement 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();
|
||||||
|
}
|
||||||
|
TQTime startTime(0,0,0);
|
||||||
|
startTime = startTime.addSecs(secs);
|
||||||
|
TQTime endTime(0,0,0);
|
||||||
|
endTime = endTime.addSecs(secs+duration);
|
||||||
|
|
||||||
|
secs += duration;
|
||||||
|
|
||||||
|
KBGCrossEvent l = {true, from, to, startTime,endTime};
|
||||||
|
|
||||||
|
timeList.append(l);
|
||||||
|
|
||||||
|
}
|
||||||
|
void KCrossBGRender::createStatic(TQDomElement docElem)
|
||||||
|
{
|
||||||
|
int duration;
|
||||||
|
TQString file;
|
||||||
|
|
||||||
|
TQDomNode n = docElem.firstChild();
|
||||||
|
while( !n.isNull() ) {
|
||||||
|
TQDomElement 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
TQTime startTime(0,0,0);
|
||||||
|
startTime = startTime.addSecs(secs);
|
||||||
|
TQTime endTime(0,0,0);
|
||||||
|
endTime = endTime.addSecs(secs+duration);
|
||||||
|
|
||||||
|
secs += duration;
|
||||||
|
|
||||||
|
KBGCrossEvent l = {false, file, NULL, startTime,endTime};
|
||||||
|
timeList.append(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "KCrossBGRender.moc"
|
@ -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__
|
||||||
|
#define __KCROSSBGRENDER_H__
|
||||||
|
|
||||||
|
|
||||||
|
#include <tqvaluelist.h>
|
||||||
|
#include <tqpixmap.h>
|
||||||
|
#include <tqvaluelist.h>
|
||||||
|
#include <tqdatetime.h>
|
||||||
|
|
||||||
|
#include "bgrender.h"
|
||||||
|
|
||||||
|
class TQDomElement;
|
||||||
|
|
||||||
|
typedef struct crossEvent{
|
||||||
|
bool transition;
|
||||||
|
TQString pix1;
|
||||||
|
TQString pix2;
|
||||||
|
TQTime stime; //start time
|
||||||
|
TQTime etime; //end time
|
||||||
|
} KBGCrossEvent;
|
||||||
|
|
||||||
|
|
||||||
|
class KCrossBGRender: public KBackgroundRenderer{
|
||||||
|
|
||||||
|
TQ_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
KCrossBGRender(int desk, int screen, bool drawBackgroundPerScreen, TDEConfig *config=0);
|
||||||
|
~KCrossBGRender();
|
||||||
|
|
||||||
|
bool needWallpaperChange();
|
||||||
|
void changeWallpaper(bool init=false);
|
||||||
|
TQPixmap pixmap();
|
||||||
|
bool usingCrossXml(){return useCrossEfect;};
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
TQPixmap pix;
|
||||||
|
int secs;
|
||||||
|
TQString xmlFileName;
|
||||||
|
bool useCrossEfect;
|
||||||
|
|
||||||
|
int actualPhase;
|
||||||
|
|
||||||
|
void createStartTime(TQDomElement e);
|
||||||
|
void createTransition(TQDomElement e);
|
||||||
|
void createStatic(TQDomElement e);
|
||||||
|
bool setCurrentEvent(bool init = false);
|
||||||
|
void initCrossFade(TQString xml);
|
||||||
|
void fixEnabled();
|
||||||
|
TQPixmap getCurrentPixmap();
|
||||||
|
KBGCrossEvent current;
|
||||||
|
TQValueList<KBGCrossEvent> timeList;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __KCROSSBGRENDER_H__
|
@ -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__
|
||||||
|
#define __CROSSFADE_H__
|
||||||
|
|
||||||
|
#include <tqtimer.h>
|
||||||
|
#include <tqpainter.h>
|
||||||
|
#include <tqpixmap.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 TQPixmap crossFade(const TQPixmap &pix1, const TQPixmap &pix2, double r_alpha,
|
||||||
|
bool sync = false){
|
||||||
|
|
||||||
|
TQPixmap pix = TQPixmap(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);
|
||||||
|
TQPixmap 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__
|
Loading…
Reference in new issue