//----------------------------------------------------------------------------- // // kfountain - Partical Fountain Screen Saver for KDE 2 // // Copyright (c) Ian Reinhart Geiser 2001 // // KConfig code and KScreenSaver "Setup..." improvements by // Nick Betcher 2001 // #include #include #include #include #include #include #include #include #include #include #include "fountain.h" #include "fountain.moc" #ifdef Q_WS_MACX #include #include #else #include #include #endif #include #include #include #include #include #include #include #include // libkscreensaver interface extern "C" { KDE_EXPORT const char *kss_applicationName = "kfountain.kss"; KDE_EXPORT const char *kss_description = I18N_NOOP( "Particle Fountain Screen Saver" ); KDE_EXPORT const char *kss_version = "2.2.0"; KDE_EXPORT KScreenSaver *kss_create( WId id ) { return new KFountainSaver( id ); } KDE_EXPORT QDialog *kss_setup() { return new KFountainSetup(); } } //----------------------------------------------------------------------------- // dialog to setup screen saver parameters // KFountainSetup::KFountainSetup( QWidget *parent, const char *name ) : SetupUi( parent, name, TRUE ) { readSettings(); //QLabel *label; //QPushButton *button; //setCaption( i18n("Setup Particle Fountain") ); //QVBoxLayout *tl = new QVBoxLayout(this, 10); //QHBoxLayout *tl1 = new QHBoxLayout; //tl->addLayout(tl1); //QVBoxLayout *tl11 = new QVBoxLayout(5); //tl1->addLayout(tl11); //label = new QLabel( i18n("No options here yet...:"), this ); ///tl11->addWidget(label);; //preview = new QWidget( this ); preview->setFixedSize( 220, 170 ); preview->setBackgroundColor( black ); preview->show(); // otherwise saver does not get correct size saver = new KFountainSaver( preview->winId() ); //tl1->addWidget(preview); //KButtonBox *bbox = new KButtonBox(this); //bbox->addStretch(1); ; connect( PushButton1, SIGNAL( clicked() ), SLOT( slotOkPressed() ) ); connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) ); connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) ); connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int))); connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool))); } // read settings from config file void KFountainSetup::readSettings() { KConfig config("kssfountainrc", false, false); config.setGroup( "Settings" ); QString boolval = config.readEntry( "Stars", "false" ); if (boolval == "true") { RadioButton1->setDown(true); RadioButton1_2->setDown(false); } else { if (boolval == "false") { RadioButton1->setDown(false); RadioButton1_2->setDown(true); } } QString starammount = config.readEntry("StarSize", "75"); SpinBox1->setValue(starammount.toInt()); } // Ok pressed - save settings and exit void KFountainSetup::slotOkPressed() { KConfig config("kssfountainrc", false, false); config.setGroup( "Settings" ); if (RadioButton1->isOn() == true) { config.writeEntry( "Stars", "true" ); } else { if (RadioButton1_2->isOn() == true) { config.writeEntry( "Stars", "false" ); } } config.writeEntry( "StarSize", QString::number(SpinBox1->value()) ); config.sync(); accept(); } void KFountainSetup::aboutPressed() { KMessageBox::about(this, i18n("

Particle Fountain

\n

Particle Fountain Screen Saver for KDE

\nCopyright (c) Ian Reinhart Geiser 2001
\n\n

KConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher 2001

")); } //----------------------------------------------------------------------------- KFountainSaver::KFountainSaver( WId id ) : KScreenSaver( id ) { kdDebug() << "Blank" << endl; timer = new QTimer( this ); timer->start( 25, TRUE ); setBackgroundColor( black ); erase(); fountain = new Fountain(); embed(fountain); fountain->show(); connect( timer, SIGNAL(timeout()), this, SLOT(blank()) ); } KFountainSaver::~KFountainSaver() { } // read configuration settings from config file void KFountainSaver::readSettings() { // Please remove me } void KFountainSaver::blank() { // Play fountain fountain->updateGL(); timer->start( 25, TRUE ); } Fountain::Fountain( QWidget * parent, const char * name) : QGLWidget (parent,name) { rainbow=true; slowdown=2.0f; zoom=-40.0f; index=0; size = 0.75f; obj = gluNewQuadric(); // This has to be here because you can't update the fountain until 'fountain' is created! KConfig config("kssfountainrc", false, false); config.setGroup( "Settings" ); QString boolval = config.readEntry( "Stars", "false" ); if (boolval == "true") { setStars(true); } else { if (boolval == "false") { setStars(false); } } QString starammount = config.readEntry("StarSize", "75"); float passvalue = (starammount.toInt() / 100.0); setSize(passvalue); } Fountain::~Fountain() { glDeleteTextures( 1, &texture[0] ); gluDeleteQuadric(obj); } /** load the particle file */ bool Fountain::loadParticle() { /* Status indicator */ bool Status = TRUE; QImage buf; kdDebug() << "Loading: " << locate("data", "kscreensaver/particle.png") << endl; if (buf.load( locate("data", "kscreensaver/particle.png") ) ) { tex = convertToGLFormat(buf); // flipped 32bit RGBA kdDebug() << "Texture loaded: " << tex.numBytes () << endl; } else { QImage dummy( 32, 32, 32 ); dummy.fill( Qt::white.rgb() ); buf = dummy; tex = convertToGLFormat( buf ); } /* Set the status to true */ //Status = TRUE; glGenTextures(1, &texture[0]); /* create three textures */ glBindTexture(GL_TEXTURE_2D, texture[0]); /* use linear filtering */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); /* actually generate the texture */ glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); return Status; } /** setup the GL enviroment */ void Fountain::initializeGL () { kdDebug() << "InitGL" << endl; GLfloat colors[12][3]= {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f}, {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f}, {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}}; if (loadParticle()) // Jump To Texture Loading Routine { /* Enable smooth shading */ glShadeModel( GL_SMOOTH ); /* Set the background black */ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); /* Depth buffer setup */ glClearDepth( 1.0f ); /* Enables Depth Testing */ glDisable( GL_DEPTH_TEST ); /* Enable Blending */ glEnable( GL_BLEND ); /* Type Of Blending To Perform */ glBlendFunc( GL_SRC_ALPHA, GL_ONE ); /* Really Nice Perspective Calculations */ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); /* Really Nice Point Smoothing */ glHint( GL_POINT_SMOOTH_HINT, GL_NICEST ); /* Enable Texture Mapping */ glEnable( GL_TEXTURE_2D ); /* Select Our Texture */ glBindTexture( GL_TEXTURE_2D, texture[0] ); for (loop=0;loopsetSize(newSize/100); } void KFountainSaver::doStars(bool starState) { fountain->setStars(starState); }