--- kpowersave-0.7.2/src/screen.h-- 2007-03-26 18:15:18.000000000 +0200 +++ kpowersave-0.7.2/src/screen.h 2007-03-26 18:15:48.000000000 +0200 @@ -119,6 +119,8 @@ //! to get the return value of gnomescreensaver-command void getGSExited(KProcess *); + void cleanProcess(KProcess *); + public slots: //! to fake a keyevent for the login dialog after suspend with lock screen --- kpowersave-0.7.2/src/screen.cpp-- 2007-03-26 18:21:19.000000000 +0200 +++ kpowersave-0.7.2/src/screen.cpp 2007-03-26 18:19:54.000000000 +0200 @@ -256,15 +256,19 @@ // check for gnome-screen-saver if (check == 10) { - if (gnomeScreensaverCheck != NULL) - delete gnomeScreensaverCheck; + delete gnomeScreensaverCheck; gnomeScreensaverCheck = new KProcess; *gnomeScreensaverCheck << "gnome-screensaver-command" << "--query"; connect( gnomeScreensaverCheck , SIGNAL(processExited(KProcess *)),SLOT(getGSExited(KProcess *))); - if(!gnomeScreensaverCheck->start(KProcess::NotifyOnExit)) return 10; + if(!gnomeScreensaverCheck->start(KProcess::NotifyOnExit)) + { + delete gnomeScreensaverCheck; + gnomeScreensaverCheck = NULL; + return 10; + } else return 99; } @@ -283,7 +287,8 @@ } else SCREENSAVER_STATUS = 10; - + delete gnomecheckcommand; + gnomecheckcommand=NULL; return; } @@ -397,35 +402,55 @@ // set lock for XScreensaver else if(SCREENSAVER_STATUS == 11){ xscreensaver: - if (xscreensaver_lock != NULL) - delete xscreensaver_lock; + delete xscreensaver_lock; xscreensaver_lock = new KProcess; *xscreensaver_lock << "xscreensaver-command" << "-lock"; - - return xscreensaver_lock->start(KProcess::DontCare); + connect(xscreensaver_lock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + + bool status = xscreensaver_lock->start(KProcess::DontCare); + if(!status) + { + delete xscreensaver_lock; + xscreensaver_lock = NULL; + } + return status; } // lock with gnome-screen-saver else if(SCREENSAVER_STATUS == 20){ - if (gnomescreensaver_lock != NULL) - delete gnomescreensaver_lock; + delete gnomescreensaver_lock; gnomescreensaver_lock = new KProcess; *gnomescreensaver_lock << "gnome-screensaver-command" << "--lock"; - - return gnomescreensaver_lock->start(KProcess::DontCare); + + connect(gnomescreensaver_lock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + bool status = gnomescreensaver_lock->start(KProcess::DontCare); + if(!status) + { + delete gnomescreensaver_lock; + gnomescreensaver_lock=NULL; + } + return status; } // set lock for xlock --> no kscreensaver, no xscreensaver present and // the check for gnome screensaver is not finished. This should normaly // not happen, but in this case we use xlock else if(SCREENSAVER_STATUS == 10 || SCREENSAVER_STATUS == 99){ - if (xlock != NULL) - delete xlock; + delete xlock; xlock = new KProcess; *xlock << "xlock"; //<< "-mode" << "blank"; - - return xlock->start(KProcess::DontCare); + connect(xlock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + bool status = xlock->start(KProcess::DontCare); + if(!status) + { + delete xlock; + xlock = NULL; + } + return status; } else return false; } @@ -445,18 +470,35 @@ return true; } else if (lock_withMethod == "xlock") { - if (xlock != NULL) - delete xlock; + delete xlock; xlock = new KProcess; *xlock << "xlock"; + connect(xlock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); - return xlock->start(KProcess::DontCare); + bool status = xlock->start(KProcess::DontCare); + if(!status) + { + delete xlock; + xlock=NULL; + } + + return status; } else if (lock_withMethod == "gnomescreensaver") { gnomescreensaver_lock = new KProcess; *gnomescreensaver_lock << "gnome-screensaver-command" << "--lock"; - return gnomescreensaver_lock->start(KProcess::DontCare); + connect(gnomescreensaver_lock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + + bool status = gnomescreensaver_lock->start(KProcess::DontCare); + if(!status) + { + delete gnomescreensaver_lock; + gnomescreensaver_lock = NULL; + } + return status; } else { // screensaver status known? @@ -478,13 +520,20 @@ else if (lock_withMethod == "xscreensaver") { if(SCREENSAVER_STATUS == 11){ xscreensaver: - if (xscreensaver_lock != NULL) - delete xscreensaver_lock; + delete xscreensaver_lock; xscreensaver_lock = new KProcess; *xscreensaver_lock << "xscreensaver-command" << "-lock"; - - return xscreensaver_lock->start(KProcess::DontCare); + connect(xscreensaver_lock, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + + bool status = xscreensaver_lock->start(KProcess::DontCare); + if(!status) + { + delete xscreensaver_lock; + xscreensaver_lock = NULL; + } + return status; } else return false; } @@ -543,7 +592,18 @@ KProcess *xset = new KProcess; *xset << "xset" << "dpms" << "force" << "off"; - xset->start(); + connect(xset, SIGNAL(processExited(KProcess*)), + this, SLOT(cleanProcess(KProcess*))); + if(!xset->start()) + { + delete xset; + } +} + +void screen::cleanProcess(KProcess* proc) +{ + delete proc; + proc = NULL; } /*!