diff options
| -rw-r--r-- | SwifTools/Idle/ActualIdleDetector.cpp | 11 | ||||
| -rw-r--r-- | SwifTools/Idle/ActualIdleDetector.h | 3 | ||||
| -rw-r--r-- | SwifTools/Idle/IdleDetector.h | 14 | ||||
| -rw-r--r-- | Swift/Controllers/IdleDetector.h | 16 | ||||
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 45 | ||||
| -rw-r--r-- | Swift/Controllers/MainController.h | 21 | ||||
| -rw-r--r-- | Swift/QtUI/QtIdleDetector.cpp | 38 | ||||
| -rw-r--r-- | Swift/QtUI/QtIdleDetector.h | 25 | ||||
| -rw-r--r-- | Swift/QtUI/QtSwift.cpp | 6 | ||||
| -rw-r--r-- | Swift/QtUI/QtSwift.h | 2 | ||||
| -rw-r--r-- | Swift/QtUI/SConscript | 1 |
11 files changed, 54 insertions, 128 deletions
diff --git a/SwifTools/Idle/ActualIdleDetector.cpp b/SwifTools/Idle/ActualIdleDetector.cpp index 2e3f307..ef73a4c 100644 --- a/SwifTools/Idle/ActualIdleDetector.cpp +++ b/SwifTools/Idle/ActualIdleDetector.cpp @@ -1,29 +1,26 @@ #include "SwifTools/Idle/ActualIdleDetector.h" #include <boost/bind.hpp> +#include <iostream> #include "SwifTools/Idle/IdleQuerier.h" #include "Swiften/Network/Timer.h" #include "Swiften/Network/TimerFactory.h" namespace Swift { -ActualIdleDetector::ActualIdleDetector(IdleQuerier* querier, TimerFactory* timerFactory, int refreshRateSeconds) : querier(querier), isIdle(false) { - timer = timerFactory->createTimer(refreshRateSeconds*1000); +ActualIdleDetector::ActualIdleDetector(IdleQuerier* querier, TimerFactory* timerFactory, int refreshRateMilliseconds) : querier(querier) { + timer = timerFactory->createTimer(refreshRateMilliseconds); timer->onTick.connect(boost::bind(&ActualIdleDetector::handleTimerTick, this)); timer->start(); } ActualIdleDetector::~ActualIdleDetector() { timer->stop(); } void ActualIdleDetector::handleTimerTick() { - bool idle = (querier->getIdleTimeSeconds() >= getIdleTimeSeconds()); - if (idle != isIdle) { - isIdle = idle; - onIdleChanged(isIdle); - } + setIdle(querier->getIdleTimeSeconds() >= getIdleTimeSeconds()); } } diff --git a/SwifTools/Idle/ActualIdleDetector.h b/SwifTools/Idle/ActualIdleDetector.h index 48428bb..7bc36e2 100644 --- a/SwifTools/Idle/ActualIdleDetector.h +++ b/SwifTools/Idle/ActualIdleDetector.h @@ -8,18 +8,17 @@ namespace Swift { class IdleQuerier; class TimerFactory; class Timer; class ActualIdleDetector : public IdleDetector, public boost::bsignals::trackable { public: - ActualIdleDetector(IdleQuerier*, TimerFactory*, int refreshRateSeconds); + ActualIdleDetector(IdleQuerier*, TimerFactory*, int refreshRateMilliseconds); ~ActualIdleDetector(); private: void handleTimerTick(); private: IdleQuerier* querier; - bool isIdle; boost::shared_ptr<Timer> timer; }; } diff --git a/SwifTools/Idle/IdleDetector.h b/SwifTools/Idle/IdleDetector.h index 1fb3d69..bd7175d 100644 --- a/SwifTools/Idle/IdleDetector.h +++ b/SwifTools/Idle/IdleDetector.h @@ -3,22 +3,36 @@ #include <boost/signals.hpp> #include <boost/shared_ptr.hpp> namespace Swift { class IdleDetector { public: + IdleDetector() : idle(false) {} virtual ~IdleDetector(); void setIdleTimeSeconds(int time) { idleTimeSeconds = time; } int getIdleTimeSeconds() const { return idleTimeSeconds; } + virtual bool isIdle() const { + return idle; + } + boost::signal<void (bool /* isIdle */)> onIdleChanged; + protected: + void setIdle(bool b) { + if (b != idle) { + idle = b; + onIdleChanged(b); + } + } + private: int idleTimeSeconds; + bool idle; }; } diff --git a/Swift/Controllers/IdleDetector.h b/Swift/Controllers/IdleDetector.h deleted file mode 100644 index 72fe07c..0000000 --- a/Swift/Controllers/IdleDetector.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include <boost/signals.hpp> -#include <boost/shared_ptr.hpp> - -namespace Swift { -class IdleDetector { - public: - virtual ~IdleDetector() {}; - virtual void forceNotIdle() = 0; - boost::signal<void ()> onInputIdle; - boost::signal<void ()> onInputNotIdle; -}; -} - - diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index f05d42d..f54e0a2 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -7,13 +7,12 @@ #include "Swiften/Application/Application.h" #include "Swiften/Application/ApplicationMessageDisplay.h" #include "Swift/Controllers/ChatController.h" #include "Swift/Controllers/ChatWindowFactory.h" #include "Swift/Controllers/EventController.h" -#include "Swift/Controllers/IdleDetector.h" #include "Swift/Controllers/LoginWindow.h" #include "Swift/Controllers/LoginWindowFactory.h" #include "Swift/Controllers/MainWindow.h" #include "Swift/Controllers/MainWindowFactory.h" #include "Swift/Controllers/MUCController.h" #include "Swift/Controllers/NickResolver.h" @@ -57,16 +56,14 @@ static const String CLIENT_NAME = "Swift"; static const String CLIENT_VERSION = "0.3"; static const String CLIENT_NODE = "http://swift.im"; typedef std::pair<JID, ChatController*> JIDChatControllerPair; typedef std::pair<JID, MUCController*> JIDMUCControllerPair; -MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer, IdleDetector* idleDetector) - : client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), - xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL) { - idleDetector_ = idleDetector; +MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer) + : timerFactory_(&boostIOServiceThread_.getIOService()), idleDetector_(&idleQuerier_, &timerFactory_, 100), client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL) { application_ = application; presenceOracle_ = NULL; avatarManager_ = NULL; avatarStorage_ = new AvatarFileStorage(application_->getAvatarDir()); @@ -79,12 +76,15 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(profile, settings); loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate")); delete profileSettings; } loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4)); loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this)); + + idleDetector_.setIdleTimeSeconds(600); + idleDetector_.onIdleChanged.connect(boost::bind(&MainController::handleInputIdleChanged, this, _1)); } MainController::~MainController() { foreach (JIDChatControllerPair controllerPair, chatControllers_) { delete controllerPair.second; } @@ -162,15 +162,12 @@ void MainController::handleConnected() { discoInfoRequest->send(); boost::shared_ptr<GetVCardRequest> vCardRequest(new GetVCardRequest(JID(), client_)); vCardRequest->onResponse.connect(boost::bind(&MainController::handleOwnVCardReceived, this, _1, _2)); vCardRequest->send(); - idleDetector_->onInputIdle.connect(boost::bind(&MainController::handleInputIdle, this)); - idleDetector_->onInputNotIdle.connect(boost::bind(&MainController::handleInputNotIdle, this)); - //Send presence last to catch all the incoming presences. boost::shared_ptr<Presence> initialPresence; if (queuedPresence_.get() != NULL) { initialPresence = queuedPresence_; } else { initialPresence = boost::shared_ptr<Presence>(new Presence()); @@ -216,25 +213,29 @@ void MainController::sendPresence(boost::shared_ptr<Presence> presence) { client_->sendPresence(presence); if (presence->getType() == Presence::Unavailable) { logout(); } } -void MainController::handleInputIdle() { - preIdlePresence_ = lastSentPresence_; - boost::shared_ptr<Presence> presence(new Presence()); - presence->setShow(StatusShow::Away); - presence->setStatus("Auto-away"); - sendPresence(presence); -} - -void MainController::handleInputNotIdle() { - if (client_) { - sendPresence(preIdlePresence_); - } else { - queuedPresence_ = preIdlePresence_; +void MainController::handleInputIdleChanged(bool idle) { + if (!client_ || !client_->isAvailable()) { + return; + } + if (idle) { + preIdlePresence_ = lastSentPresence_; + boost::shared_ptr<Presence> presence(new Presence()); + presence->setShow(StatusShow::Away); + presence->setStatus("Auto-away"); + sendPresence(presence); + } + else { + if (client_) { + sendPresence(preIdlePresence_); + } else { + queuedPresence_ = preIdlePresence_; + } } } void MainController::handleIncomingPresence(boost::shared_ptr<Presence> presence) { //FIXME: subscribe, subscribed rosterController_->handleIncomingPresence(presence); @@ -301,14 +302,12 @@ void MainController::handleError(const ClientError& error) { void MainController::handleCancelLoginRequest() { signOut(); } void MainController::signOut() { logout(); - idleDetector_->onInputIdle.connect(boost::bind(&MainController::handleInputIdle, this)); - idleDetector_->onInputNotIdle.connect(boost::bind(&MainController::handleInputNotIdle, this)); loginWindow_->loggedOut(); foreach (JIDChatControllerPair controllerPair, chatControllers_) { delete controllerPair.second; } chatControllers_.clear(); foreach (JIDMUCControllerPair controllerPair, mucControllers_) { diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index df6901d..270b131 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -1,13 +1,16 @@ -#ifndef SWIFTEN_MainController_H -#define SWIFTEN_MainController_H +#pragma once #include <boost/signals.hpp> #include <boost/shared_ptr.hpp> #include <vector> +#include "Swiften/Network/BoostIOServiceThread.h" +#include "Swiften/Network/BoostTimerFactory.h" +#include "SwifTools/Idle/PlatformIdleQuerier.h" +#include "SwifTools/Idle/ActualIdleDetector.h" #include "Swiften/Base/String.h" #include "Swiften/Client/ClientError.h" #include "Swiften/JID/JID.h" #include "Swiften/Elements/VCard.h" #include "Swiften/Elements/DiscoInfo.h" #include "Swiften/Elements/ErrorPayload.h" @@ -22,13 +25,12 @@ namespace Swift { class AvatarStorage; class Application; class Client; class ChatWindowFactory; class ChatController; class EventController; - class IdleDetector; class MainWindowFactory; class MainWindow; class NickResolver; class RosterController; class XMPPRosterController; class DiscoInfoResponder; @@ -44,13 +46,13 @@ namespace Swift { class SystemTrayController; class SoundEventController; class SoundPlayer; class MainController : public MUCRegistry { public: - MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory* treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer, IdleDetector* idleDetector); + MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory* treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer); ~MainController(); private: void resetClient(); @@ -66,22 +68,26 @@ namespace Swift { void handleError(const ClientError& error); void handleServerDiscoInfoResponse(boost::shared_ptr<DiscoInfo>, const boost::optional<ErrorPayload>&); void handleEventQueueLengthChange(int count); void handleOwnVCardReceived(boost::shared_ptr<VCard> vCard, const boost::optional<ErrorPayload>& error); ChatController* getChatController(const JID &contact); void sendPresence(boost::shared_ptr<Presence> presence); - void handleInputIdle(); - void handleInputNotIdle(); + void handleInputIdleChanged(bool); void logout(); void signOut(); virtual bool isMUC(const JID& muc) const; void performLoginFromCachedCredentials(); void reconnectAfterError(); void setManagersEnabled(bool enabled); + + BoostIOServiceThread boostIOServiceThread_; + BoostTimerFactory timerFactory_; + PlatformIdleQuerier idleQuerier_; + ActualIdleDetector idleDetector_; Client* client_; ChatWindowFactory* chatWindowFactory_; MainWindowFactory* mainWindowFactory_; LoginWindowFactory* loginWindowFactory_; TreeWidgetFactory* treeWidgetFactory_; SettingsProvider *settings_; @@ -92,13 +98,12 @@ namespace Swift { RosterController* rosterController_; EventController* eventController_; LoginWindow* loginWindow_; SoftwareVersionResponder* clientVersionResponder_; NickResolver* nickResolver_; DiscoInfoResponder* discoResponder_; - IdleDetector* idleDetector_; boost::shared_ptr<CapsInfo> capsInfo_; std::map<JID, MUCController*> mucControllers_; std::map<JID, ChatController*> chatControllers_; boost::shared_ptr<DiscoInfo> serverDiscoInfo_; boost::shared_ptr<XMPPRoster> xmppRoster_;; JID jid_; @@ -111,8 +116,6 @@ namespace Swift { String vCardPhotoHash_; boost::shared_ptr<Presence> queuedPresence_; String password_; String certificateFile_; }; } -#endif - diff --git a/Swift/QtUI/QtIdleDetector.cpp b/Swift/QtUI/QtIdleDetector.cpp deleted file mode 100644 index 783cc14..0000000 --- a/Swift/QtUI/QtIdleDetector.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "QtIdleDetector.h" - -#include <QCursor> - -namespace Swift { - -QtIdleDetector::QtIdleDetector() { - signalled_ = false; - lastMoveTime_ = QDateTime::currentDateTime(); - lastPosition_ = QCursor::pos(); - connect(&timer_, SIGNAL(timeout()), this, SLOT(handleTimerTick())); - timer_.start(1000); -} - -QtIdleDetector::~QtIdleDetector() { -} - -void QtIdleDetector::forceNotIdle() { - -} - -void QtIdleDetector::handleTimerTick() { - QPoint position = QCursor::pos(); - QDateTime now = QDateTime::currentDateTime(); - if (position != lastPosition_) { - if (signalled_) { - onInputNotIdle(); - } - lastPosition_ = position; - lastMoveTime_ = now; - signalled_ = false; - } else if (!signalled_ && now > lastMoveTime_.addSecs(600) && position == lastPosition_) { - signalled_ = true; - onInputIdle(); - } -} - -} diff --git a/Swift/QtUI/QtIdleDetector.h b/Swift/QtUI/QtIdleDetector.h deleted file mode 100644 index 444fb15..0000000 --- a/Swift/QtUI/QtIdleDetector.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "Swift/Controllers/IdleDetector.h" - -#include <QObject> -#include <QPoint> -#include <QTimer> -#include <QDateTime> - -namespace Swift { -class QtIdleDetector : public QObject, public IdleDetector { - Q_OBJECT - public: - QtIdleDetector(); - virtual ~QtIdleDetector(); - virtual void forceNotIdle(); - private slots: - void handleTimerTick(); - private: - QPoint lastPosition_; - QDateTime lastMoveTime_; - QTimer timer_; - bool signalled_; -}; -} diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp index 0def66f..2aaa27e 100644 --- a/Swift/QtUI/QtSwift.cpp +++ b/Swift/QtUI/QtSwift.cpp @@ -5,14 +5,12 @@ #include "QtLoginWindow.h" #include "QtChatTabs.h" #include "QtMainWindowFactory.h" #include "Roster/QtTreeWidgetFactory.h" #include "QtSystemTray.h" #include "QtSoundPlayer.h" -#include "QtIdleDetector.h" - #include <boost/bind.hpp> #include <QSplitter> #include "Swiften/Application/Application.h" #include "Swiften/Application/Platform/PlatformApplication.h" #include "Swiften/Base/String.h" @@ -39,17 +37,16 @@ QtSwift::QtSwift(bool netbookMode) { treeWidgetFactory_ = new QtTreeWidgetFactory(); systemTray_ = new QtSystemTray(); loginWindowFactory_ = new QtLoginWindowFactory(splitter_, systemTray_, settings_); chatWindowFactory_ = new QtChatWindowFactory(treeWidgetFactory_, splitter_, settings_); rosterWindowFactory_ = new QtMainWindowFactory(treeWidgetFactory_); soundPlayer_ = new QtSoundPlayer(); - idleDetector_ = new QtIdleDetector(); if (splitter_) { splitter_->show(); } - mainController_ = new MainController(chatWindowFactory_, rosterWindowFactory_, loginWindowFactory_, treeWidgetFactory_, settings_, application_, systemTray_, soundPlayer_, idleDetector_); + mainController_ = new MainController(chatWindowFactory_, rosterWindowFactory_, loginWindowFactory_, treeWidgetFactory_, settings_, application_, systemTray_, soundPlayer_); } QtSwift::~QtSwift() { delete chatWindowFactory_; delete rosterWindowFactory_; delete loginWindowFactory_; @@ -57,10 +54,9 @@ QtSwift::~QtSwift() { delete mainController_; delete settings_; delete application_; delete systemTray_; delete splitter_; delete soundPlayer_; - delete idleDetector_; } } diff --git a/Swift/QtUI/QtSwift.h b/Swift/QtUI/QtSwift.h index 60ff5a7..263dc05 100644 --- a/Swift/QtUI/QtSwift.h +++ b/Swift/QtUI/QtSwift.h @@ -4,13 +4,12 @@ #include "Swiften/Base/String.h" #include "Swiften/EventLoop/Qt/QtEventLoop.h" #include "QtLoginWindowFactory.h" #include "QtMainWindowFactory.h" #include "QtChatWindowFactory.h" #include "QtSettingsProvider.h" -#include "QtIdleDetector.h" class QSplitter; namespace Swift { class Application; class MainController; @@ -34,12 +33,11 @@ namespace Swift { QtLoginWindowFactory *loginWindowFactory_; QtEventLoop clientMainThreadCaller_; QtSettingsProvider *settings_; QtSystemTray* systemTray_; QSplitter* splitter_; QtSoundPlayer* soundPlayer_; - QtIdleDetector* idleDetector_; Application* application_; }; } #endif diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index d30f3b9..800a009 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -49,13 +49,12 @@ myenv.Command("DefaultTheme.qrc", "../resources/themes/Default", Action(generate sources = [ "main.cpp", "QtAboutWidget.cpp", "QtAddContactDialog.cpp", "QtChatWindow.cpp", "QtChatWindowFactory.cpp", - "QtIdleDetector.cpp", "QtJoinMUCDialog.cpp", "QtLoginWindow.cpp", "QtLoginWindowFactory.cpp", "QtMainWindow.cpp", "QtMainWindowFactory.cpp", "QtSettingsProvider.cpp", |
Swift