diff options
Diffstat (limited to 'karm/desktoptracker.cpp')
-rw-r--r-- | karm/desktoptracker.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/karm/desktoptracker.cpp b/karm/desktoptracker.cpp new file mode 100644 index 000000000..52eb67210 --- /dev/null +++ b/karm/desktoptracker.cpp @@ -0,0 +1,137 @@ +#include <algorithm> // std::find + +#include <qtimer.h> +#include <kdebug.h> + +#include "desktoptracker.h" + +// TODO: Put in config dialog +const int minimumInterval = 5; // seconds + +DesktopTracker::DesktopTracker () +{ + // Setup desktop change handling + connect( &kWinModule, SIGNAL( currentDesktopChanged(int) ), + this, SLOT( handleDesktopChange(int) )); + + _desktopCount = kWinModule.numberOfDesktops(); + _previousDesktop = kWinModule.currentDesktop()-1; + // TODO: removed? fixed by Lubos? + // currentDesktop will return 0 if no window manager is started + if( _previousDesktop < 0 ) _previousDesktop = 0; + + _timer = new QTimer(this); + connect( _timer, SIGNAL( timeout() ), this, SLOT( changeTimers() ) ); +} + +void DesktopTracker::handleDesktopChange( int desktop ) +{ + _desktop = desktop; + + // If user changes back and forth between desktops rapidly and frequently, + // the data file can get huge fast if logging is turned on. Then saving + // get's slower, etc. There's no benefit in saving a lot of start/stop + // events that are very small. Wait a bit to make sure the user is settled. + if ( !_timer->start( minimumInterval * 1000, true ) ) changeTimers(); +} + +void DesktopTracker::changeTimers() +{ + _desktop--; // desktopTracker starts with 0 for desktop 1 + // notify start all tasks setup for running on desktop + TaskVector::iterator it; + + // stop trackers for _previousDesktop + TaskVector tv = desktopTracker[_previousDesktop]; + for (it = tv.begin(); it != tv.end(); ++it) { + emit leftActiveDesktop(*it); + } + + // start trackers for desktop + tv = desktopTracker[_desktop]; + for (it = tv.begin(); it != tv.end(); ++it) { + emit reachedtActiveDesktop(*it); + } + _previousDesktop = _desktop; + + // emit updateButtons(); +} + +QString DesktopTracker::startTracking() +{ + QString err; + int currentDesktop = kWinModule.currentDesktop() -1; + // TODO: removed? fixed by Lubos? + // currentDesktop will return 0 if no window manager is started + if ( currentDesktop < 0 ) currentDesktop = 0; + if ( currentDesktop < maxDesktops ) + { + TaskVector &tv = desktopTracker[ currentDesktop ]; + TaskVector::iterator tit = tv.begin(); + while(tit!=tv.end()) + { + emit reachedtActiveDesktop(*tit); + tit++; + } + } + else err="ETooHighDeskTopNumber"; + return err; +} + +void DesktopTracker::registerForDesktops( Task* task, DesktopList desktopList) +{ + // if no desktop is marked, disable auto tracking for this task + if (desktopList.size()==0) { + for (int i=0; i<maxDesktops; i++) { + TaskVector *v = &(desktopTracker[i]); + TaskVector::iterator tit = std::find(v->begin(), v->end(), task); + if (tit != v->end()) + desktopTracker[i].erase(tit); + // if the task was priviously tracking this desktop then + // emit a signal that is not tracking it any more + if( i == kWinModule.currentDesktop() -1) + emit leftActiveDesktop(task); + } + + return; + } + + // If desktop contains entries then configure desktopTracker + // If a desktop was disabled, it will not be stopped automatically. + // If enabled: Start it now. + if (desktopList.size()>0) { + for (int i=0; i<maxDesktops; i++) { + TaskVector& v = desktopTracker[i]; + TaskVector::iterator tit = std::find(v.begin(), v.end(), task); + // Is desktop i in the desktop list? + if ( std::find( desktopList.begin(), desktopList.end(), i) + != desktopList.end()) { + if (tit == v.end()) // not yet in start vector + v.push_back(task); // track in desk i + } + else { // delete it + if (tit != v.end()) // not in start vector any more + { + v.erase(tit); // so we delete it from desktopTracker + // if the task was priviously tracking this desktop then + // emit a signal that is not tracking it any more + if( i == kWinModule.currentDesktop() -1) + emit leftActiveDesktop(task); + } + } + } + startTracking(); + } +} + +void DesktopTracker::printTrackers() { + TaskVector::iterator it; + for (int i=0; i<maxDesktops; i++) { + TaskVector& start = desktopTracker[i]; + it = start.begin(); + while (it != start.end()) { + it++; + } + } +} +#include "desktoptracker.moc" |