//----------------------------------------------------------------------------- // // klines 0.1.1 - Basic screen saver for TDE // by Dirk Staneker 1997 // based on kpolygon from Martin R. Jones 1996 // mailto:dirk.staneker@student.uni-tuebingen.de // // layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org> // 2001/03/04 Converted to libtdescreensaver by Martin R. Jones #include <config.h> #include <stdlib.h> #include <time.h> #include <tqcolor.h> #include <tqlabel.h> #include <tqslider.h> #include <tdeconfig.h> #include <tdeapplication.h> #include <tdemessagebox.h> #include <kcolorbutton.h> #include "kcolordialog.h" #include "lines.h" #include "lines.moc" #include <tqlayout.h> #include <tdelocale.h> #include <tdeglobal.h> #include <tqpainter.h> #define MAXLENGTH 256 // libtdescreensaver interface extern "C" { KDE_EXPORT const char *kss_applicationName = "klines.kss"; KDE_EXPORT const char *kss_description = I18N_NOOP( "KLines" ); KDE_EXPORT const char *kss_version = "2.2.0"; KDE_EXPORT KScreenSaver *kss_create( WId id ) { return new kLinesSaver( id ); } KDE_EXPORT TQDialog *kss_setup() { return new kLinesSetup(); } } // Methods of the Lines-class Lines::Lines(int x){ uint i; numLn=x; offx1=12; offy1=16; offx2=9; offy2=10; start=new Ln; end=start; for(i=1; i<numLn; i++){ end->next=new Ln; end=end->next; } end->next=start; akt=start; } Lines::~Lines(){ uint i; for(i=0; i<numLn; i++){ end=start->next; delete start; start=end; } } inline void Lines::reset(){ akt=start; } inline void Lines::getKoord(int& a, int& b, int& c, int& d){ a=akt->x1; b=akt->y1; c=akt->x2; d=akt->y2; akt=akt->next; } inline void Lines::setKoord(const int& a, const int& b, const int& c, const int& d){ akt->x1=a; akt->y1=b; akt->x2=c; akt->y2=d; } inline void Lines::next(void){ akt=akt->next; } void Lines::turn(const int& w, const int& h){ start->x1=end->x1+offx1; start->y1=end->y1+offy1; start->x2=end->x2+offx2; start->y2=end->y2+offy2; if(start->x1>=w) offx1=-8; if(start->x1<=0) offx1=7; if(start->y1>=h) offy1=-11; if(start->y1<=0) offy1=13; if(start->x2>=w) offx2=-17; if(start->x2<=0) offx2=15; if(start->y2>=h) offy2=-10; if(start->y2<=0) offy2=13; end->next=start; start=start->next; end=end->next; } //----------------------------------------------------------------------------- // dialog to setup screen saver parameters // kLinesSetup::kLinesSetup(TQWidget *parent, const char *name) : KDialogBase(parent, name, true, i18n( "Setup Lines Screen Saver" ), Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), speed( 50 ) { readSettings(); setButtonText( Help, i18n( "A&bout" ) ); TQWidget *main = makeMainWidget(); TQHBoxLayout *tl = new TQHBoxLayout(main, 0, spacingHint()); TQVBoxLayout *tl1 = new TQVBoxLayout; tl->addLayout(tl1); TQLabel *label=new TQLabel(i18n("Length:"), main); tl1->addWidget(label); TQSlider *sb= new TQSlider(1, MAXLENGTH+1, 16, length, Qt::Horizontal, main); sb->setMinimumSize(120, 20); sb->setTickmarks(TQSlider::Below); sb->setTickInterval(32); connect(sb, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotLength(int))); tl1->addWidget(sb); label=new TQLabel(i18n("Speed:"), main); tl1->addWidget(label); sb = new TQSlider(0, 100, 10, speed, Qt::Horizontal, main); sb->setMinimumSize(120, 20); sb->setTickmarks(TQSlider::Below); sb->setTickInterval(10); connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) ); tl1->addWidget(sb); label=new TQLabel(i18n("Beginning:"), main); tl1->addWidget(label); colorPush0=new KColorButton(colstart, main); connect(colorPush0, TQT_SIGNAL(changed(const TQColor &)), TQT_SLOT(slotColstart(const TQColor &))); tl1->addWidget(colorPush0); label=new TQLabel(i18n("Middle:"), main); tl1->addWidget(label); colorPush1=new KColorButton(colmid, main); connect(colorPush1, TQT_SIGNAL(changed(const TQColor &)), TQT_SLOT(slotColmid(const TQColor &))); tl1->addWidget(colorPush1); label=new TQLabel(i18n("End:"), main); tl1->addWidget(label); colorPush2=new KColorButton(colend, main); connect(colorPush2, TQT_SIGNAL(changed(const TQColor &)), TQT_SLOT(slotColend(const TQColor &))); tl1->addWidget(colorPush2); tl1->addStretch(); preview = new TQWidget( main ); preview->setFixedSize( 220, 170 ); preview->setBackgroundColor( black ); preview->show(); // otherwise saver does not get correct size saver=new kLinesSaver(preview->winId()); tl->addWidget(preview); } kLinesSetup::~kLinesSetup() { delete saver; } // read settings from config file void kLinesSetup::readSettings(){ TDEConfig *config = TDEGlobal::config(); config->setGroup( "Settings" ); TQString str; length = config->readNumEntry("Length", length); if(length>MAXLENGTH) length=MAXLENGTH; else if(length<1) length=1; speed = config->readNumEntry("Speed", speed); if(speed>100) speed=100; else if(speed<50) speed=50; str=config->readEntry("StartColor"); if(!str.isNull()) colstart.setNamedColor(str); else colstart=white; str=config->readEntry("MidColor"); if(!str.isNull()) colmid.setNamedColor(str); else colmid=blue; str=config->readEntry("EndColor"); if(!str.isNull()) colend.setNamedColor(str); else colend=black; } void kLinesSetup::slotLength(int len){ length=len; if(saver) saver->setLines(length); } void kLinesSetup::slotSpeed(int num){ speed=num; if(saver) saver->setSpeed(speed); } void kLinesSetup::slotColstart(const TQColor &col){ colstart = col; if(saver) saver->setColor(colstart, colmid, colend); } void kLinesSetup::slotColmid(const TQColor &col){ colmid = col; if(saver) saver->setColor(colstart, colmid, colend); } void kLinesSetup::slotColend(const TQColor &col){ colend = col; if(saver) saver->setColor(colstart, colmid, colend); } void kLinesSetup::slotHelp(){ KMessageBox::about(this, i18n("Lines Version 2.2.0\n\n" "Written by Dirk Staneker 1997\n" "dirk.stanerker@student.uni-tuebingen.de")); } // Ok pressed - save settings and exit void kLinesSetup::slotOk(){ TDEConfig *config = TDEGlobal::config(); config->setGroup("Settings"); TQString slength; slength.setNum(length); config->writeEntry("Length", slength); TQString sspeed; sspeed.setNum( speed ); config->writeEntry( "Speed", sspeed ); TQString colName0, colName1, colName2; colName0.sprintf("#%02x%02x%02x", colstart.red(), colstart.green(), colstart.blue() ); config->writeEntry( "StartColor", colName0 ); colName1.sprintf("#%02x%02x%02x", colmid.red(), colmid.green(), colmid.blue() ); config->writeEntry( "MidColor", colName1 ); colName2.sprintf("#%02x%02x%02x", colend.red(), colend.green(), colend.blue() ); config->writeEntry( "EndColor", colName2 ); config->sync(); accept(); } //----------------------------------------------------------------------------- kLinesSaver::kLinesSaver( WId id ) : KScreenSaver( id ){ readSettings(); lines=new Lines(numLines); colorContext=TQColor::enterAllocContext(); blank(); initialiseColor(); initialiseLines(); timer.start(speed); connect(&timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); } kLinesSaver::~kLinesSaver(){ timer.stop(); TQColor::leaveAllocContext(); TQColor::destroyAllocContext(colorContext); delete lines; } // set lines properties void kLinesSaver::setLines(int len){ timer.stop(); numLines=len; initialiseLines(); initialiseColor(); blank(); timer.start(speed); } // set the speed void kLinesSaver::setSpeed(int spd){ timer.stop(); speed=100-spd; timer.start(speed); } void kLinesSaver::setColor(const TQColor& cs, const TQColor& cm, const TQColor& ce){ colstart=cs; colmid=cm; colend=ce; initialiseColor(); } // read configuration settings from config file void kLinesSaver::readSettings(){ TDEConfig *config=TDEGlobal::config(); config->setGroup("Settings"); numLines=config->readNumEntry("Length", 10); speed = 100- config->readNumEntry("Speed", 50); if(numLines>MAXLENGTH) numLines=MAXLENGTH; else if(numLines<1) numLines = 1; colstart=config->readColorEntry("StartColor", &white); colmid=config->readColorEntry("MidColor", &blue); colend=config->readColorEntry("EndColor", &black); } // draw next lines and erase tail void kLinesSaver::slotTimeout(){ uint i; int x1,y1,x2,y2; int col=0; lines->reset(); TQPainter p( this ); p.setPen( black ); for(i=0; i<numLines; i++){ lines->getKoord(x1,y1,x2,y2); p.drawLine( x1, y1, x2, y2 ); p.setPen( colors[col] ); col=(int)(i*colscale); if(col>63) col=0; } lines->turn(width(), height()); } void kLinesSaver::blank(){ setBackgroundColor( black ); erase(); } // initialise the lines void kLinesSaver::initialiseLines(){ uint i; int x1,y1,x2,y2; delete lines; lines=new Lines(numLines); lines->reset(); x1=rnd.getLong(width()); y1=rnd.getLong(height()); x2=rnd.getLong(width()); y2=rnd.getLong(height()); for(i=0; i<numLines; i++){ lines->setKoord(x1,y1,x2,y2); lines->next(); } } // create a color table of 64 colors void kLinesSaver::initialiseColor(){ int i; double mr, mg, mb; double cr, cg, cb; mr=(double)(colmid.red()-colstart.red())/32; mg=(double)(colmid.green()-colstart.green())/32; mb=(double)(colmid.blue()-colstart.blue())/32; cr=colstart.red(); cg=colstart.green(); cb=colstart.blue(); for(i=0; i<32; i++){ colors[63-i].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb)); } mr=(double)(colend.red()-colmid.red())/32; mg=(double)(colend.green()-colmid.green())/32; mb=(double)(colend.blue()-colmid.blue())/32; cr=colmid.red(); cg=colmid.green(); cb=colmid.blue(); for(i=0; i<32; i++){ colors[31-1].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb)); } colscale=64.0/(double)numLines; }