From 22b51f8f82f6bd3186339b05943c1e19aa71050f Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Sun, 25 Oct 2009 17:20:54 +0000
Subject: Autoaway.


diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 5495ec0..15947b6 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -185,7 +185,6 @@ void MainController::handleEventQueueLengthChange(int count) {
 
 void MainController::handleChangeStatusRequest(StatusShow::Type show, const String &statusText) {
 	boost::shared_ptr<Presence> presence(new Presence());
-	presence->addPayload(capsInfo_);
 	if (show == StatusShow::None) {
 		// FIXME: This is wrong. None doesn't mean unavailable
 		presence->setType(Presence::Unavailable);
@@ -206,6 +205,7 @@ void MainController::sendPresence(boost::shared_ptr<Presence> presence) {
 	if (!vCardPhotoHash_.isEmpty()) {
 		presence->addPayload(boost::shared_ptr<VCardUpdate>(new VCardUpdate(vCardPhotoHash_)));
 	}
+	presence->addPayload(capsInfo_);
 	lastSentPresence_ = presence;
 	client_->sendPresence(presence);
 	if (presence->getType() == Presence::Unavailable) {
@@ -214,11 +214,19 @@ void MainController::sendPresence(boost::shared_ptr<Presence> presence) {
 }
 
 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::handleIncomingPresence(boost::shared_ptr<Presence> presence) {
diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h
index 5cdd9fa..3179df9 100644
--- a/Swift/Controllers/MainController.h
+++ b/Swift/Controllers/MainController.h
@@ -106,6 +106,7 @@ namespace Swift {
 			SoundEventController* soundEventController_;
 			AvatarManager* avatarManager_;
 			boost::shared_ptr<Presence> lastSentPresence_;
+			boost::shared_ptr<Presence> preIdlePresence_;
 			String vCardPhotoHash_;
 			boost::shared_ptr<Presence> queuedPresence_;
 			String password_;
diff --git a/Swift/QtUI/QtIdleDetector.cpp b/Swift/QtUI/QtIdleDetector.cpp
index e947854..783cc14 100644
--- a/Swift/QtUI/QtIdleDetector.cpp
+++ b/Swift/QtUI/QtIdleDetector.cpp
@@ -1,8 +1,15 @@
 #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() {
@@ -12,5 +19,20 @@ 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
index e21e4a8..444fb15 100644
--- a/Swift/QtUI/QtIdleDetector.h
+++ b/Swift/QtUI/QtIdleDetector.h
@@ -2,13 +2,24 @@
 
 #include "Swift/Controllers/IdleDetector.h"
 
+#include <QObject>
+#include <QPoint>
+#include <QTimer>
+#include <QDateTime>
+
 namespace Swift {
-class QtIdleDetector : public IdleDetector {
+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_;
 };
 }
-- 
cgit v0.10.2-6-g49f6