summaryrefslogtreecommitdiff
path: root/tubes
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@gmail.com>2012-07-24 13:56:51 +0200
committerMatúš Kukan <matus.kukan@gmail.com>2012-07-24 23:33:09 +0200
commit9c6a6ec047261aab6b0e4b9ac4f3206aebc0d192 (patch)
tree2d2e4b0b7ec2b2d02d0669755015c4a23b2df5fa /tubes
parent5800c9aa3052aaa1429edb110e9b0291aa642cd7 (diff)
tubes: keep contacts dialog updated on contacts' presence changes
- make the dialog - TubeContacts static pointer, so there is only one Change-Id: I12f256bebc27ba31a82082d7107066de8079893c
Diffstat (limited to 'tubes')
-rw-r--r--tubes/inc/tubes/contact-list.hxx6
-rw-r--r--tubes/source/contact-list.cxx15
2 files changed, 21 insertions, 0 deletions
diff --git a/tubes/inc/tubes/contact-list.hxx b/tubes/inc/tubes/contact-list.hxx
index 9c48ab7896ce..bb504dc7fafc 100644
--- a/tubes/inc/tubes/contact-list.hxx
+++ b/tubes/inc/tubes/contact-list.hxx
@@ -29,10 +29,12 @@
#ifndef INCLUDED_TUBES_CONTACT_LIST_HXX
#define INCLUDED_TUBES_CONTACT_LIST_HXX
+#include <set>
#include <utility>
#include <vector>
#include "tubes/tubesdllapi.h"
+#include <tubes/warnings_guard_boost_signals2.hpp>
typedef struct _TpAccount TpAccount;
typedef struct _TpContact TpContact;
@@ -49,8 +51,12 @@ public:
AccountContactPairV getContacts();
+ /** Emitted when a contact changes its presence. */
+ boost::signals2::signal<void ()> sigContactListChanged;
+
private:
TpAccountManager* mpAccountManager;
+ std::set< TpContact* > maRegistered;
};
diff --git a/tubes/source/contact-list.cxx b/tubes/source/contact-list.cxx
index 0d4680358fd3..78f84b534417 100644
--- a/tubes/source/contact-list.cxx
+++ b/tubes/source/contact-list.cxx
@@ -92,6 +92,15 @@ tb_contact_is_online (TpContact *contact)
}
}
+static void presence_changed_cb( TpContact* /* contact */,
+ guint /* type */,
+ gchar* /* status */,
+ gchar* /* message */,
+ gpointer pContactList )
+{
+ reinterpret_cast<ContactList*> (pContactList)->sigContactListChanged();
+}
+
AccountContactPairV ContactList::getContacts()
{
GList *accounts;
@@ -121,6 +130,12 @@ AccountContactPairV ContactList::getContacts()
{
TpContact *contact =
reinterpret_cast<TpContact *>(g_ptr_array_index (contacts, i));
+ if (maRegistered.find (contact) == maRegistered.end())
+ {
+ maRegistered.insert (contact);
+ g_signal_connect (contact, "presence-changed",
+ G_CALLBACK (presence_changed_cb), this );
+ }
if (contact != self &&
tb_contact_is_online (contact))