diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ae7e6d5..ded1c7e 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -22,6 +22,8 @@ tde_add_kpart( twin_deKorator AUTOMOC SOURCES deKoratorclient.cpp + myrootpixmap.cpp + imageholder.cpp shadow.cpp LINK tdecore-shared diff --git a/client/config/configdialog.ui b/client/config/configdialog.ui index 3de1a43..07997a7 100644 --- a/client/config/configdialog.ui +++ b/client/config/configdialog.ui @@ -8,8 +8,8 @@ 0 0 - 471 - 525 + 481 + 568 @@ -39,7 +39,7 @@ generalbox - GroupBoxPanel + NoFrame Sunken @@ -509,11 +509,22 @@ Colors - + unnamed - + + + transparencyChkBox + + + Enable transparency + + + false + + + layout19 @@ -581,7 +592,7 @@ - + @@ -1943,8 +1954,6 @@ Email: <a href="mailto:moty.rahamim@gmail.com"><font color="#ff0000"> - - useMasks_Chkbox @@ -2085,7 +2094,6 @@ Email: <a href="mailto:moty.rahamim@gmail.com"><font color="#ff0000"> setEnabled(bool) - kactivelabel.h kcolorbutton.h @@ -2094,4 +2102,5 @@ Email: <a href="mailto:moty.rahamim@gmail.com"><font color="#ff0000"> kurlrequester.h tdelistview.h + diff --git a/client/config/deKoratorconfig.cpp b/client/config/deKoratorconfig.cpp index 9543688..1bd5257 100644 --- a/client/config/deKoratorconfig.cpp +++ b/client/config/deKoratorconfig.cpp @@ -102,6 +102,7 @@ DeKoratorConfig::DeKoratorConfig( TDEConfig* config, TQWidget* parent ) // colors + connect( dialog_->transparencyChkBox, TQ_SIGNAL( clicked() ), TQ_SIGNAL( changed() ) ); connect( dialog_->colorizeActFramesChkBox, TQ_SIGNAL( clicked() ), TQ_SIGNAL( changed() ) ); connect( dialog_->colorizeActButtonsChkBox, TQ_SIGNAL( clicked() ), TQ_SIGNAL( changed() ) ); connect( dialog_->colorizeInActFramesChkBox, TQ_SIGNAL( clicked() ), TQ_SIGNAL( changed() ) ); @@ -193,13 +194,13 @@ void DeKoratorConfig::load( TDEConfig* ) TQString value = config_->readEntry( "TitleAlignment", "AlignHCenter" ); TQRadioButton *button = ( TQRadioButton* ) dialog_->titlealign->child( value ); - if ( button ) button->setChecked( TRUE ); - dialog_->useMenuImageChkBox->setChecked( config_->readBoolEntry( "UseMenuImage", FALSE ) ); - dialog_->ignoreAppIcnCol->setChecked( config_->readBoolEntry( "IgnoreAppIconCol", FALSE ) ); - dialog_->dblClkCloseChkBox->setChecked( config_->readBoolEntry( "DblClkClose", FALSE ) ); - dialog_->showBtmBorderChkBox->setChecked( config_->readBoolEntry( "ShowBtmBorder", FALSE ) ); + if ( button ) button->setChecked( true ); + dialog_->useMenuImageChkBox->setChecked( config_->readBoolEntry( "UseMenuImage", false ) ); + dialog_->ignoreAppIcnCol->setChecked( config_->readBoolEntry( "IgnoreAppIconCol", false ) ); + dialog_->dblClkCloseChkBox->setChecked( config_->readBoolEntry( "DblClkClose", false ) ); + dialog_->showBtmBorderChkBox->setChecked( config_->readBoolEntry( "ShowBtmBorder", false ) ); TQColor color = TQColor( 50, 50, 50 ); - dialog_->useShdtextChkBox->setChecked( config_->readBoolEntry( "UseShdtext", TRUE ) ); + dialog_->useShdtextChkBox->setChecked( config_->readBoolEntry( "UseShdtext", true ) ); dialog_->activeShdtextXSpinBox->setValue( config_->readNumEntry( "ActiveShdtextX", 1 ) ); dialog_->activeShdtextYSpinBox->setValue( config_->readNumEntry( "ActiveShdtextY", 1 ) ); dialog_->activeShdColBtn->setColor( config_->readColorEntry( "ActiveShadowColor", &color ) ); @@ -213,16 +214,17 @@ void DeKoratorConfig::load( TDEConfig* ) // colors config_->setGroup( "COLORS" ); - dialog_->colorizeActFramesChkBox->setChecked( config_->readBoolEntry( "ColorizeActFrames", FALSE ) ); - dialog_->colorizeActButtonsChkBox->setChecked( config_->readBoolEntry( "ColorizeActButtons", FALSE ) ); - dialog_->colorizeInActFramesChkBox->setChecked( config_->readBoolEntry( "ColorizeInActFrames", FALSE ) ); - dialog_->colorizeInActButtonsChkBox->setChecked( config_->readBoolEntry( "ColorizeInActButtons", FALSE ) ); - dialog_->useAnimChkBox->setChecked( config_->readBoolEntry( "UseAnimation", FALSE ) ); + dialog_->transparencyChkBox->setChecked( config_->readBoolEntry( "Transparency", false ) ); + dialog_->colorizeActFramesChkBox->setChecked( config_->readBoolEntry( "ColorizeActFrames", false ) ); + dialog_->colorizeActButtonsChkBox->setChecked( config_->readBoolEntry( "ColorizeActButtons", false ) ); + dialog_->colorizeInActFramesChkBox->setChecked( config_->readBoolEntry( "ColorizeInActFrames", false ) ); + dialog_->colorizeInActButtonsChkBox->setChecked( config_->readBoolEntry( "ColorizeInActButtons", false ) ); + dialog_->useAnimChkBox->setChecked( config_->readBoolEntry( "UseAnimation", false ) ); dialog_->animateEfeectsCombo->setCurrentText( config_->readEntry( "AnimationType", "Intensity" ) ); dialog_->stepsSpinBox->setValue( config_->readNumEntry( "AnimSteps", 5 ) ); dialog_->intervalSpinBox->setValue( config_->readNumEntry( "AnimInterval", 30 ) ); - dialog_->KeepAnimateChkBox->setChecked( config_->readBoolEntry( "KeepAnimating", FALSE ) ); + dialog_->KeepAnimateChkBox->setChecked( config_->readBoolEntry( "KeepAnimating", false ) ); dialog_->activeHighlightClrBtn->setColor( config_->readColorEntry( "ActiveHighlightColor", &color ) ); dialog_->inActiveHighlightClrBtn->setColor( config_->readColorEntry( "InActiveHighlightColor", &color ) ); @@ -235,9 +237,9 @@ void DeKoratorConfig::load( TDEConfig* ) // buttons config_->setGroup( "BUTTONS" ); - dialog_->useCusBtnClrChkBox->setChecked( config_->readBoolEntry( "UseCustomButtonsColors", FALSE ) ); - dialog_->cusColActBtnChkBox->setChecked( config_->readBoolEntry( "customColorsActiveButtons", FALSE ) ); - dialog_->cusColInActBtnChkBox->setChecked( config_->readBoolEntry( "customColorsInActiveButtons", FALSE ) ); + dialog_->useCusBtnClrChkBox->setChecked( config_->readBoolEntry( "UseCustomButtonsColors", false ) ); + dialog_->cusColActBtnChkBox->setChecked( config_->readBoolEntry( "customColorsActiveButtons", false ) ); + dialog_->cusColInActBtnChkBox->setChecked( config_->readBoolEntry( "customColorsInActiveButtons", false ) ); dialog_->closeClrBtn->setColor( config_->readColorEntry( "CloseButtonColor", &color ) ); dialog_->minClrBtn->setColor( config_->readColorEntry( "MinButtonColor", &color ) ); dialog_->maxClrBtn->setColor( config_->readColorEntry( "MaxButtonColor", &color ) ); @@ -262,7 +264,7 @@ void DeKoratorConfig::load( TDEConfig* ) dialog_->framesPathKurl->setURL( config_->readEntry( "FramesPath", (deftheme.isNull() ? "" : deftheme + "deco") ) ); dialog_->buttonsPathKurl->setURL( config_->readEntry( "ButtonsPath", (deftheme.isNull() ? "" : deftheme + "buttons") ) ); - dialog_->useMasks_Chkbox->setChecked( config_->readBoolEntry( "UseMasks", TRUE ) ); + dialog_->useMasks_Chkbox->setChecked( config_->readBoolEntry( "UseMasks", true ) ); dialog_->masksPathKurl->setURL( config_->readEntry( "MasksPath", (deftheme.isNull() ? "" : deftheme + "masks") ) ); // Find and preselect current theme @@ -304,6 +306,7 @@ void DeKoratorConfig::save( TDEConfig* ) // colors config_->setGroup( "COLORS" ); + config_->writeEntry( "Transparency", dialog_->transparencyChkBox->isChecked() ); config_->writeEntry( "ColorizeActFrames", dialog_->colorizeActFramesChkBox->isChecked() ); config_->writeEntry( "ColorizeActButtons", dialog_->colorizeActButtonsChkBox->isChecked() ); config_->writeEntry( "ColorizeInActFrames", dialog_->colorizeInActFramesChkBox->isChecked() ); @@ -385,6 +388,7 @@ void DeKoratorConfig::defaults() dialog_->btnShiftYSpinBox->setValue( 0 ); // colors + dialog_->transparencyChkBox->setChecked( FALSE ); dialog_->colorizeActFramesChkBox->setChecked( FALSE ); dialog_->colorizeActButtonsChkBox->setChecked( FALSE ); dialog_->colorizeInActFramesChkBox->setChecked( FALSE ); diff --git a/client/deKoratorclient.cpp b/client/deKoratorclient.cpp index 5c312fc..dc14eeb 100644 --- a/client/deKoratorclient.cpp +++ b/client/deKoratorclient.cpp @@ -36,6 +36,7 @@ #endif #include "deKoratorclient.h" +#include "imageholder.h" #include @@ -175,6 +176,7 @@ TQString DeKoratorFactory::framesPath_ = ""; TQString DeKoratorFactory::buttonsPath_ = ""; TQString DeKoratorFactory::masksPath_ = ""; +bool DeKoratorFactory::transparency_ = FALSE; extern "C" { @@ -196,6 +198,11 @@ DeKoratorFactory::DeKoratorFactory() readConfig(); initialized_ = TRUE; + if (transparency_) + imageHolder = new QImageHolder(TQImage(), TQImage()); + else + imageHolder = nullptr; + initPixmaps(); loadPixmaps(); @@ -226,6 +233,9 @@ DeKoratorFactory::~DeKoratorFactory() initialized_ = FALSE; int i, j, k; + if (imageHolder) + delete imageHolder; + for ( i = 0; i < decoCount; i++ ) { for ( j = 0; j < pixTypeCount; j++ ) @@ -351,19 +361,19 @@ bool DeKoratorFactory::readConfig() TITLEALIGN = TQt::AlignRight; bool oldUseMenuImage = USEMENUEIMAGE; - USEMENUEIMAGE = config.readBoolEntry( "UseMenuImage", "false" ); + USEMENUEIMAGE = config.readBoolEntry( "UseMenuImage", false ); bool oldIgnoreAppIcnCol = IGNOREAPPICNCOL; - IGNOREAPPICNCOL = config.readBoolEntry( "IgnoreAppIconCol", "false" ); + IGNOREAPPICNCOL = config.readBoolEntry( "IgnoreAppIconCol", false ); // bool oldDblClkClose = DBLCLKCLOSE; - DBLCLKCLOSE = config.readBoolEntry( "DblClkClose", "false" ); + DBLCLKCLOSE = config.readBoolEntry( "DblClkClose", false ); bool oldShowBtmBorder = SHOWBTMBORDER; - SHOWBTMBORDER = config.readBoolEntry( "ShowBtmBorder", "false" ); + SHOWBTMBORDER = config.readBoolEntry( "ShowBtmBorder", false ); bool oldUseShdtext = USESHDTEXT; - USESHDTEXT = config.readBoolEntry( "UseShdtext", "false" ); + USESHDTEXT = config.readBoolEntry( "UseShdtext", false ); int oldActiveShdtextX = ACTIVESHDTEXTX; ACTIVESHDTEXTX = config.readNumEntry( "ActiveShdtextX", 0 ); @@ -394,25 +404,28 @@ bool DeKoratorFactory::readConfig() // color's settings config.setGroup( "COLORS" ); + bool oldTransparency = DeKoratorFactory::transparency_; + DeKoratorFactory::transparency_ = config.readBoolEntry( "Transparency", false ); + bool oldColorizeActFrames = DeKoratorFactory::colorizeActFrames_; - DeKoratorFactory::colorizeActFrames_ = config.readBoolEntry( "ColorizeActFrames", "false" ); + DeKoratorFactory::colorizeActFrames_ = config.readBoolEntry( "ColorizeActFrames", false ); bool oldColorizeActButtons = DeKoratorFactory::colorizeActButtons_; - DeKoratorFactory::colorizeActButtons_ = config.readBoolEntry( "ColorizeActButtons", "false" ); + DeKoratorFactory::colorizeActButtons_ = config.readBoolEntry( "ColorizeActButtons", false ); bool oldColorizeInActFrames = DeKoratorFactory::colorizeInActFrames_; - DeKoratorFactory::colorizeInActFrames_ = config.readBoolEntry( "ColorizeInActFrames", "false" ); + DeKoratorFactory::colorizeInActFrames_ = config.readBoolEntry( "ColorizeInActFrames", false ); bool oldColorizeInActButtons = DeKoratorFactory::colorizeInActButtons_; - DeKoratorFactory::colorizeInActButtons_ = config.readBoolEntry( "ColorizeInActButtons", "false" ); + DeKoratorFactory::colorizeInActButtons_ = config.readBoolEntry( "ColorizeInActButtons", false ); - USEANIMATION = config.readBoolEntry( "UseAnimation", "false" ); + USEANIMATION = config.readBoolEntry( "UseAnimation", false ); ANIMATIONTYPE = config.readEntry( "AnimationType", "Liquid Method" ); STEPS = config.readNumEntry( "AnimSteps", 5 ); INTERVAL = config.readNumEntry( "AnimInterval", 30 ); - KEEPANIMATING = config.readBoolEntry( "KeepAnimating", "false" ); + KEEPANIMATING = config.readBoolEntry( "KeepAnimating", false ); BUTTONHOVERTYPE = config.readEntry( "ButtonsHoverType", "To Gray" ); @@ -435,13 +448,13 @@ bool DeKoratorFactory::readConfig() config.setGroup( "BUTTONS" ); bool oldUseCustomButtonsColors = DeKoratorFactory::useCustomButtonsColors_; - DeKoratorFactory::useCustomButtonsColors_ = config.readBoolEntry( "UseCustomButtonsColors", "false" ); + DeKoratorFactory::useCustomButtonsColors_ = config.readBoolEntry( "UseCustomButtonsColors", false ); bool oldCustomColorsActiveButtons = DeKoratorFactory::customColorsActiveButtons_; - DeKoratorFactory::customColorsActiveButtons_ = config.readBoolEntry( "customColorsActiveButtons", "false" ); + DeKoratorFactory::customColorsActiveButtons_ = config.readBoolEntry( "customColorsActiveButtons", false ); bool oldCustomColorsInActiveButtons = DeKoratorFactory::customColorsInActiveButtons_; - DeKoratorFactory::customColorsInActiveButtons_ = config.readBoolEntry( "customColorsInActiveButtons", "false" ); + DeKoratorFactory::customColorsInActiveButtons_ = config.readBoolEntry( "customColorsInActiveButtons", false ); // load buttons colors TQColor colArr[ buttonTypeAllCount ]; @@ -486,7 +499,7 @@ bool DeKoratorFactory::readConfig() DeKoratorFactory::buttonsPath_ = config.readEntry( "ButtonsPath", "" ); bool oldUseMasks = USEMASKS; - USEMASKS = config.readBoolEntry( "UseMasks", "false" ); + USEMASKS = config.readBoolEntry( "UseMasks", false ); TQString oldMasksPath = DeKoratorFactory::masksPath_; DeKoratorFactory::masksPath_ = config.readEntry( "MasksPath", "" ); @@ -517,6 +530,7 @@ bool DeKoratorFactory::readConfig() oldInActiveShdtextX == INACTIVESHDTEXTX && oldInActiveShdtextY == INACTIVESHDTEXTY && oldInActiveShadeColor == INACTIVESHADECOLOR && + oldTransparency == DeKoratorFactory::transparency_ && oldColorizeActFrames == DeKoratorFactory::colorizeActFrames_ && oldColorizeActButtons == DeKoratorFactory::colorizeActButtons_ && oldColorizeInActFrames == DeKoratorFactory::colorizeInActFrames_ && @@ -551,7 +565,8 @@ bool DeKoratorFactory::readConfig() if ( oldFramesPath != DeKoratorFactory::framesPath_ || oldButtonsPath != DeKoratorFactory::buttonsPath_ || - oldMasksPath != DeKoratorFactory::masksPath_ + oldMasksPath != DeKoratorFactory::masksPath_ || + oldTransparency != DeKoratorFactory::transparency_ ) DeKoratorFactory::needReload_ = TRUE; else @@ -1077,7 +1092,7 @@ void DeKoratorFactory::chooseRightPixmaps() } ////////////////////////////////////////////////////////////////////////////// -// prepareDecoWithBbCol() +// prepareDecoWithBgCol() // void DeKoratorFactory::prepareDecoWithBgCol() { @@ -1092,6 +1107,11 @@ void DeKoratorFactory::prepareDecoWithBgCol() { for ( i = 0 ; i < decoCount ; i++ ) { + if (transparency_) { + //DECOARR[ i ][ actCol ] = DECOARR[ i ][ actCol ]; + continue; + } + tempPix.resize( DECOARR[ i ][ orig ] ->width(), DECOARR[ i ][ orig ] ->height() ); tempPix.fill( col ); @@ -1109,6 +1129,11 @@ void DeKoratorFactory::prepareDecoWithBgCol() { for ( i = 0 ; i < decoCount ; i++ ) { + if (transparency_) { + DECOARR[ i ][ normal ] = new TQPixmap(*DECOARR[ i ][ orig ]); + continue; + } + tempPix.resize( DECOARR[ i ][ orig ] ->width(), DECOARR[ i ][ orig ] ->height() ); tempPix.fill( col ); @@ -1127,6 +1152,11 @@ void DeKoratorFactory::prepareDecoWithBgCol() { for ( i = 0 ; i < decoCount ; i++ ) { + if (transparency_) { + //DECOARR[ i ][ inActCol ] = DECOARR[ i ][ inActCol ]; + continue; + } + tempPix.resize( DECOARR[ i ][ orig ] ->width(), DECOARR[ i ][ orig ] ->height() ); tempPix.fill( col ); @@ -1144,6 +1174,11 @@ void DeKoratorFactory::prepareDecoWithBgCol() { for ( i = 0 ; i < decoCount ; i++ ) { + if (transparency_) { + DECOARR[ i ][ normal ] = new TQPixmap(*DECOARR[ i ][ orig ]); + continue; + } + tempPix.resize( DECOARR[ i ][ orig ] ->width(), DECOARR[ i ][ orig ] ->height() ); tempPix.fill( col ); @@ -1347,6 +1382,14 @@ void DeKoratorButton::drawButton( TQPainter * painter ) int dx = 0, dy = 0; bool act = client_->isActive(); TQImage buttonImgBak; + TQPixmap *background = client_->decoFactory_->imageHolder->image(act); + + if (background && DeKoratorFactory::transparency_) { + TQRect r = rect(); + TQPoint p = mapToGlobal( TQPoint(0,0) ); + r.moveBy( p.x(), p.y() ); + painter->drawPixmap( TQPoint(0,0), *background, r ); + } // fill background if ( isLeft_ ) @@ -1717,6 +1760,12 @@ void DeKoratorClient::init() connect( this, TQ_SIGNAL( keepAboveChanged( bool ) ), TQ_SLOT( keepAboveChange( bool ) ) ); connect( this, TQ_SIGNAL( keepBelowChanged( bool ) ), TQ_SLOT( keepBelowChange( bool ) ) ); + if (DeKoratorFactory::transparency_) + { + connect( decoFactory_->imageHolder, TQ_SIGNAL( repaintNeeded() ), this, TQ_SLOT( repaint() ) ); + connect( &repaintTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( repaint() ) ); + } + captionBufferDirty_ = true; //maskDirty_ = true; widget() ->update( titleBarSpacer_->geometry() ); @@ -2312,6 +2361,15 @@ void DeKoratorClient::wheelEvent( TQWheelEvent *e ) titlebarMouseWheelOperation( e->delta() ); } +////////////////////////////////////////////////////////////////////////////// +// repaint() +// ----------------------- +// +void DeKoratorClient::repaint() { + widget()->repaint(); + for (int n=0; nreset(); +} ////////////////////////////////////////////////////////////////////////////// // paintEvent() @@ -2334,11 +2392,19 @@ void DeKoratorClient::paintEvent( TQPaintEvent* ) TQRect rightTitleR( rightTitleBarSpacer_->geometry() ); titleR.rect( &tx, &ty, &tw, &th ); TQRect rect; + TQPixmap* background = decoFactory_->imageHolder->image(isActive()); + TQPoint p = widget()->mapToGlobal(TQPoint(0,0)); + + if (background && DeKoratorFactory::transparency_) + painter.drawPixmap( 0, 0, *background, p.x(), p.y(), w, h ); TQPainter painter2; TQPixmap pix( w, TITLESIZE ); painter2.begin( &pix ); { + if (background && DeKoratorFactory::transparency_) + painter2.drawPixmap( 0, 0, *background, p.x(), p.y(), w, TITLESIZE ); + // topLeftCorner rect.setRect( 0, 0, TOPLEFTCORNERWIDTH, TITLESIZE ); @@ -2584,6 +2650,8 @@ void DeKoratorClient::updateCaptionBuffer() // Window is being resized void DeKoratorClient::resizeEvent( TQResizeEvent *e ) { + if ( !repaintTimer.isActive() && DeKoratorFactory::transparency_ ) + repaintTimer.start(0, true); if ( widget() ->isShown() ) { TQRegion region = widget() ->rect(); diff --git a/client/deKoratorclient.h b/client/deKoratorclient.h index 3147fbd..e74774a 100644 --- a/client/deKoratorclient.h +++ b/client/deKoratorclient.h @@ -58,6 +58,7 @@ #include "shadow.h" +class QImageHolder; class TQSpacerItem; class TQPoint; @@ -160,7 +161,7 @@ private: static bool colorizeActFrames_; static bool colorizeInActFrames_; static bool needInit_; - static bool needReload_; + static bool needReload_; static TQString framesPath_; static TQString buttonsPath_; static TQString masksPath_; @@ -172,6 +173,9 @@ public: static bool colorizeActButtons_; static bool colorizeInActButtons_; static TQColor cusBtnCol_[ buttonTypeAllCount ]; + static bool transparency_; + + QImageHolder *imageHolder; }; inline bool DeKoratorFactory::initialized() @@ -298,6 +302,7 @@ private slots: void keepAboveChange( bool ); void keepBelowChange( bool ); void menuButtonReleased(); + void repaint(); private: DeKoratorButton *button[ ButtonTypeCount ]; @@ -305,6 +310,7 @@ private: TQHBoxLayout *titleLayout_ ; TQHBoxLayout *midLayout_; TQSpacerItem *leftTitleBarSpacer_, *titleBarSpacer_, *rightTitleBarSpacer_, *leftSpacer_, *rightSpacer_, *bottomSpacer_; + TQTimer repaintTimer; bool closing_; TQPixmap *captionBufferPix_; bool captionBufferDirty_; diff --git a/client/imageholder.cpp b/client/imageholder.cpp new file mode 100644 index 0000000..c37026b --- /dev/null +++ b/client/imageholder.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + * Copyright (C) 2006 by Sascha Hlusiak * + * Spam84@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + + +#include +#include +#include +#include +#include "imageholder.h" + + +QImageHolder::QImageHolder(TQImage act,TQImage inact) +:img_active(NULL),img_inactive(NULL) +{ + rootpixmap=NULL; + setUserdefinedPictures( act,inact); + initialized=userdefinedActive && userdefinedInactive; + + emit repaintNeeded(); +} + +QImageHolder::~QImageHolder() +{ + if (rootpixmap)delete rootpixmap; + if (img_active && !userdefinedActive)delete img_active; + if (img_inactive && !userdefinedInactive)delete img_inactive; +} + +void QImageHolder::setUserdefinedPictures( TQImage act,TQImage inact) +{ + int w=TQApplication::desktop()->width(); + int h=TQApplication::desktop()->height(); + if (img_active && !userdefinedActive) + { + delete img_active; + img_active=NULL; + } + if (img_inactive && !userdefinedInactive) + { + delete img_inactive; + img_inactive=NULL; + } + + if (!act.isNull()) + img_active=new TQPixmap(act); + else + img_active=NULL; + if (!inact.isNull()) + img_inactive=new TQPixmap(inact); + else + img_inactive=NULL; + + userdefinedActive=(img_active!=NULL); + userdefinedInactive=(img_inactive!=NULL); + + CheckSanity(); +} + +void QImageHolder::Init() +{ + if (initialized)return; + + rootpixmap=new KMyRootPixmap(NULL/*,this*/); + rootpixmap->start(); + rootpixmap->repaint(true); + connect( rootpixmap,TQ_SIGNAL(backgroundUpdated(const TQImage*)),this, TQ_SLOT(BackgroundUpdated(const TQImage*))); + connect(kapp, TQ_SIGNAL(backgroundChanged(int)),TQ_SLOT(handleDesktopChanged(int))); + + initialized=true; +} + +void QImageHolder::repaint(bool force) +{ + Init(); + if (rootpixmap)rootpixmap->repaint(force); +} + +void QImageHolder::handleDesktopChanged(int) +{ + repaint(true); +} + +void QImageHolder::CheckSanity() +{ + if (!initialized)return; + if (userdefinedActive && userdefinedInactive)return; + if (img_active!=NULL && !userdefinedActive)return; + if (img_inactive!=NULL && !userdefinedInactive)return; + + if (rootpixmap)delete rootpixmap; + rootpixmap=NULL; + + initialized=false; +} + +void QImageHolder::BackgroundUpdated(const TQImage *src) +{ + if (img_active && !userdefinedActive) + { + delete img_active; + img_active=NULL; + } + if (img_inactive && !userdefinedInactive) + { + delete img_inactive; + img_inactive=NULL; + } + + if (src && !src->isNull()) + { + if (!userdefinedInactive) + img_inactive=new TQPixmap(src->copy()); + if (!userdefinedActive) + img_active=new TQPixmap(src->copy()); + } + + emit repaintNeeded(); +} + +#include "imageholder.moc" diff --git a/client/imageholder.h b/client/imageholder.h new file mode 100644 index 0000000..d5dfbc3 --- /dev/null +++ b/client/imageholder.h @@ -0,0 +1,63 @@ +/*************************************************************************** + * Copyright (C) 2006 by Sascha Hlusiak * + * Spam84@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + + +#ifndef _IMAGEHOLDER_INCLUDED_ +#define _IMAGEHOLDER_INCLUDED_ + + +#include +#include "myrootpixmap.h" + +struct WND_CONFIG; + +class QImageHolder:public TQObject +{ + TQ_OBJECT + +public: + QImageHolder(TQImage act,TQImage inact); + virtual ~QImageHolder(); + + void Init(); + TQPixmap *image(bool active) { Init(); return active?img_active:img_inactive; } + void repaint(bool force); + + void setUserdefinedPictures(TQImage act,TQImage inact); + +private: + bool initialized; + KMyRootPixmap *rootpixmap; + TQPixmap *img_active,*img_inactive; + bool userdefinedActive,userdefinedInactive; + + TQPixmap* ApplyEffect(TQImage &src,WND_CONFIG* cfg,TQColorGroup colorgroup); + +public slots: + void BackgroundUpdated(const TQImage *); + void handleDesktopChanged(int desk); + void CheckSanity(); + +signals: + void repaintNeeded(); +}; + + +#endif diff --git a/client/myrootpixmap.cpp b/client/myrootpixmap.cpp new file mode 100644 index 0000000..1504147 --- /dev/null +++ b/client/myrootpixmap.cpp @@ -0,0 +1,258 @@ +/* + * + * $Id: krootpixmap.cpp,v 1.20 2003/06/01 01:49:31 hadacek Exp $ + * + * This file is part of the KDE project, module tdeui. + * Copyright (C) 1999,2000 Geert Jansen + * + * You can Freely distribute this program under the GNU Library + * General Public License. See the file "COPYING.LIB" for the exact + * licensing terms. + */ + +/* Modified by Sascha Hlusiak */ +/* Further modified 11/18/2014 by Timothy Pearson */ + +#include +#include +#include +#include + +#ifndef TQ_WS_TQWS //FIXME +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "myrootpixmap.h" + +static TQString wallpaperForDesktop(int desktop) +{ + return DCOPRef("kdesktop", "KBackgroundIface").call("currentWallpaper", desktop); +} + +DesktopWallpaperWatcher::DesktopWallpaperWatcher() : TQWidget(), m_old_current_desktop(-1) +{ + kapp->installX11EventFilter( this ); + (void ) kapp->desktop(); //trigger desktop widget creation to select root window events +} + +DesktopWallpaperWatcher::~DesktopWallpaperWatcher() +{ +} + +bool DesktopWallpaperWatcher::x11Event( XEvent * ev ) +{ + if ( ev->xany.window == tqt_xrootwin() ) { + NETRootInfo rinfo( tqt_xdisplay(), NET::CurrentDesktop ); + rinfo.activate(); + + if ( rinfo.currentDesktop() != m_old_current_desktop ) { + emit currentDesktopChanged( rinfo.currentDesktop() ); + } + + m_old_current_desktop = rinfo.currentDesktop(); + } + + return false; +} + +class KMyRootPixmapData +{ +public: +#ifdef TQ_WS_X11 + DesktopWallpaperWatcher *twin; +#endif +}; + +KMyRootPixmap::KMyRootPixmap( TQWidget * widget, const char *name ) + : TQObject(widget, name ? name : "KMyRootPixmap" ) +{ + init(); +} + +KMyRootPixmap::KMyRootPixmap( TQWidget *, TQObject *parent, const char *name ) + : TQObject( parent, name ? name : "KMyRootPixmap" ) +{ + init(); +} + +void KMyRootPixmap::init() +{ + d = new KMyRootPixmapData; +// m_Fade = 0; + m_pPixmap = new TDESharedPixmap; +// m_pTimer = new TQTimer( this ); + m_bInit = false; + m_bActive = false; + m_Desk=-1; +// m_bCustomPaint = false; + +// connect(kapp, TQ_SIGNAL(backgroundChanged(int)), TQ_SLOT(slotBackgroundChanged(int))); + connect(m_pPixmap, TQ_SIGNAL(done(bool)), TQ_SLOT(slotDone(bool))); +// connect(m_pTimer, TQ_SIGNAL(timeout()), TQ_SLOT(repaint())); + +#ifdef TQ_WS_X11 + d->twin = new DesktopWallpaperWatcher(); + connect(d->twin, TQ_SIGNAL(currentDesktopChanged(int)), TQ_SLOT(desktopChanged(int))); +#endif + +// d->toplevel = m_pWidget->topLevelWidget(); +// d->toplevel->installEventFilter(this); +} + +KMyRootPixmap::~KMyRootPixmap() +{ + delete m_pPixmap; + delete d; +} + +void KMyRootPixmap::desktopChanged(int desktop) +{ + if (wallpaperForDesktop(m_Desk) == wallpaperForDesktop(desktop) && + !wallpaperForDesktop(m_Desk).isNull()) + return; + +// #ifdef TQ_WS_X11 +// if (KWin::windowInfo(m_pWidget->topLevelWidget()->winId()).desktop() == NET::OnAllDesktops && +// pixmapName(m_Desk) != pixmapName(desktop)) +// #endif + repaint(true); +} + +int KMyRootPixmap::currentDesktop() const +{ + NETRootInfo rinfo( tqt_xdisplay(), NET::CurrentDesktop ); + rinfo.activate(); + return rinfo.currentDesktop(); +} + +void KMyRootPixmap::start() +{ + if (m_bActive) + return; + + m_bActive = true; + enableExports(); + return; +// if (m_bInit) +// repaint(true); +} + +void KMyRootPixmap::stop() +{ + m_bActive = false; +// m_pTimer->stop(); +} + + +void KMyRootPixmap::repaint() +{ + repaint(false); +} + +void KMyRootPixmap::repaint(bool force) +{ +// printf("KMyRootPixmap::repaint(%s)\n",force?"true":"false"); + if ((!force) && (m_Desk==currentDesktop()))return; + + m_Desk = currentDesktop(); + + if (!isAvailable()) + { + emit backgroundUpdated(NULL); + }else{ + // TDESharedPixmap will correctly generate a tile for us. + m_pPixmap->loadFromShared(pixmapName(m_Desk)); + updateBackground( m_pPixmap ); + } +} + +bool KMyRootPixmap::isAvailable() +{ + return m_pPixmap->isAvailable(pixmapName(m_Desk)); +} + +TQString KMyRootPixmap::pixmapName(int desk) +{ + TQString pattern = TQString("DESKTOP%1"); + int screen_number = DefaultScreen(tqt_xdisplay()); + if (screen_number) { + pattern = TQString("SCREEN%1-DESKTOP").arg(screen_number) + "%1"; + } + return pattern.arg( desk ); +} + + +void KMyRootPixmap::enableExports() +{ +// kdDebug(270) << k_lineinfo << "activating background exports.\n"; + DCOPClient *client = kapp->dcopClient(); + if (!client->isAttached()) + client->attach(); + TQByteArray data; + TQDataStream args( data, IO_WriteOnly ); + args << 1; + + TQCString appname( "kdesktop" ); + int screen_number = DefaultScreen(tqt_xdisplay()); + if ( screen_number ) + appname.sprintf("kdesktop-screen-%d", screen_number ); + + client->send( appname, "KBackgroundIface", "setExport(int)", data ); +} + + +void KMyRootPixmap::slotDone(bool success) +{ + if (!success) + { +// kdWarning(270) << k_lineinfo << "loading of desktop background failed.\n"; + return; + } + + // We need to test active as the pixmap might become available + // after the widget has been destroyed. + if ( m_bActive ) + updateBackground( m_pPixmap ); +} + +void KMyRootPixmap::updateBackground( TDESharedPixmap *spm ) +{ +// printf("KMyRootPixmap::updateBackground(%p)\n",spm); + TQPixmap *px=spm; + if (px->isNull() || px->width()==0 || px->height()==0) + { // This is NOT an image, something went wrong, update to plain + emit backgroundUpdated(NULL); + return; + } + KPixmapIO io; + TQSize desktopsize(TQApplication::desktop()->width(),TQApplication::desktop()->height()); + + if (px->rect().size()==desktopsize) + { // Image has already the right dimension, make a quick update + TQImage img = io.convertToImage(*spm); + emit backgroundUpdated(&img); + return; + }else{ // we need to create a tiled pixmap and then the image to update + TQPixmap pix(desktopsize,spm->TQPixmap::depth()); + TQPainter pufferPainter(&pix); + + pufferPainter.drawTiledPixmap(pix.rect(),*spm); + + pufferPainter.end(); + + TQImage img=io.convertToImage(pix); + emit backgroundUpdated(&img); + } +} + +#include "myrootpixmap.moc" +#endif diff --git a/client/myrootpixmap.h b/client/myrootpixmap.h new file mode 100644 index 0000000..9c8d649 --- /dev/null +++ b/client/myrootpixmap.h @@ -0,0 +1,116 @@ +/* + * + * $Id: krootpixmap.h,v 1.15 2003/05/19 08:02:48 coolo Exp $ + * This file is part of the KDE project, module kdesktop. + * Copyright (C) 1999,2000 Geert Jansen + * + * You can Freely distribute this program under the GNU Library General + * Public License. See the file "COPYING.LIB" for the exact licensing terms. + */ + +/* Modified by Sascha Hlusiak */ +/* Further modified 11/18/2014 by Timothy Pearson */ + +#ifndef __KRootPixmap_h_Included__ +#define __KRootPixmap_h_Included__ + +#include +#include +#include + +#ifndef TQ_WS_TQWS //FIXME + +class TQRect; +class TQTimer; +class TDESharedPixmap; +class KMyRootPixmapData; + +class DesktopWallpaperWatcher : public TQWidget +{ + TQ_OBJECT + + public: + DesktopWallpaperWatcher(); + ~DesktopWallpaperWatcher(); + + bool x11Event( XEvent * ev ); + + signals: + void currentDesktopChanged( int desktop); + + private: + int m_old_current_desktop; +}; + +class KMyRootPixmap: public TQObject +{ + TQ_OBJECT + +public: + KMyRootPixmap( TQWidget *target=NULL, const char *name=0 ); + + KMyRootPixmap( TQWidget *target, TQObject *parent, const char *name=0 ); + + virtual ~KMyRootPixmap(); + + bool isAvailable(); + + bool isActive() const { return m_bActive; } + + int currentDesktop() const; + +// bool customPainting() const { return m_bCustomPaint; } + +#ifndef KDE_NO_COMPAT + + bool checkAvailable(bool) { return isAvailable(); } +#endif + +public slots: + virtual void start(); + + virtual void stop(); + +// void setFadeEffect(double strength, const TQColor &color); + + void repaint( bool force ); + + void repaint(); + +// void setCustomPainting( bool enable ) { m_bCustomPaint = enable; } + + void enableExports(); + + static TQString pixmapName(int desk); + +signals: + void backgroundUpdated( const TQImage *pm ); + +protected: +// virtual bool eventFilter(TQObject *, TQEvent *); + + virtual void updateBackground( TDESharedPixmap * ); + +private slots: +// void slotBackgroundChanged(int); + void slotDone(bool); + void desktopChanged(int desktop); + +private: + bool m_bActive, m_bInit/*, m_bCustomPaint*/; + int m_Desk; + +// double m_Fade; +// TQColor m_FadeColor; + + TQRect m_Rect; +// TQWidget *m_pWidget; +// TQTimer *m_pTimer; + TDESharedPixmap *m_pPixmap; + KMyRootPixmapData *d; + + void init(); +}; + +#endif // ! TQ_WS_TQWS +#endif // __KRootPixmap_h_Included__