You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/karm/desktoptracker.cpp

138 lines
4.1 KiB

#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"