diff options
author | Matúš Kukan <matus.kukan@gmail.com> | 2012-07-24 13:56:51 +0200 |
---|---|---|
committer | Matúš Kukan <matus.kukan@gmail.com> | 2012-07-24 23:33:09 +0200 |
commit | 9c6a6ec047261aab6b0e4b9ac4f3206aebc0d192 (patch) | |
tree | 2d2e4b0b7ec2b2d02d0669755015c4a23b2df5fa /tubes | |
parent | 5800c9aa3052aaa1429edb110e9b0291aa642cd7 (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.hxx | 6 | ||||
-rw-r--r-- | tubes/source/contact-list.cxx | 15 |
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)) |