[polari] mainWindow: Display topic



commit 872db34e82f64f91080efa1c1a2894517ed993b3
Author: Florian Müllner <florian muellner gmail com>
Date:   Tue Jul 23 00:48:04 2013 +0200

    mainWindow: Display topic

 src/lib/polari-room.c |   77 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/mainWindow.js     |    7 ++++
 2 files changed, 84 insertions(+), 0 deletions(-)
---
diff --git a/src/lib/polari-room.c b/src/lib/polari-room.c
index 00031ea..82d6f2d 100644
--- a/src/lib/polari-room.c
+++ b/src/lib/polari-room.c
@@ -26,9 +26,12 @@ struct _PolariRoomPrivate {
   GIcon *icon;
   char  *id;
   char  *display_name;
+  char  *topic;
 
   guint identifier_notify_id;
   guint group_contacts_changed_id;
+
+  TpProxySignalConnection *properties_changed_id;
 };
 
 enum
@@ -39,6 +42,7 @@ enum
   PROP_ICON,
   PROP_CHANNEL,
   PROP_DISPLAY_NAME,
+  PROP_TOPIC,
 
   LAST_PROP
 };
@@ -61,6 +65,11 @@ static guint signals[LAST_SIGNAL];
 
 G_DEFINE_TYPE_WITH_PRIVATE (PolariRoom, polari_room, G_TYPE_OBJECT)
 
+#define tp_properties_changed_cb \
+        tp_cli_dbus_properties_signal_callback_properties_changed
+#define tp_properties_get_all_cb \
+        tp_cli_dbus_properties_callback_for_get_all
+
 gboolean
 polari_room_should_highlight_message (PolariRoom *room,
                                       TpMessage *message)
@@ -218,6 +227,50 @@ on_group_contacts_changed (TpChannel  *channel,
 }
 
 static void
+update_subject (PolariRoom *room,
+                GHashTable *properties)
+{
+  PolariRoomPrivate *priv = room->priv;
+  const char *subject;
+
+  subject = tp_asv_get_string (properties, "Subject");
+  if (subject == NULL || g_strcmp0 (priv->topic, subject) == 0)
+    return;
+
+  g_free (priv->topic);
+  priv->topic = *subject ? g_strdup (subject) : NULL;
+
+  g_object_notify_by_pspec (G_OBJECT (room), props[PROP_TOPIC]);
+}
+
+static void
+subject_get_all (TpProxy *proxy,
+                 GHashTable *properties,
+                 GError     *error,
+                 gpointer    user_data,
+                 GObject    *object)
+{
+  if (error)
+    return;
+
+  update_subject (POLARI_ROOM (user_data), properties);
+}
+
+static void
+properties_changed (TpProxy *proxy,
+                    const char *iface_name,
+                    GHashTable *changed,
+                    const char *invalidated,
+                    gpointer    data,
+                    GObject    *weak_ref)
+{
+  if (strcmp (iface_name, TP_IFACE_CHANNEL_INTERFACE_SUBJECT) != 0)
+    return;
+
+  update_subject (POLARI_ROOM (data), changed);
+}
+
+static void
 polari_room_set_channel (PolariRoom *room,
                          TpChannel  *channel)
 {
@@ -235,6 +288,9 @@ polari_room_set_channel (PolariRoom *room,
     {
       g_signal_handler_disconnect (priv->channel, priv->identifier_notify_id);
       g_signal_handler_disconnect (priv->channel, priv->group_contacts_changed_id);
+
+      tp_proxy_signal_connection_disconnect (priv->properties_changed_id);
+
       g_clear_object (&priv->channel);
     }
 
@@ -245,12 +301,23 @@ polari_room_set_channel (PolariRoom *room,
       if (priv->id == NULL)
         priv->id = g_strdup (tp_proxy_get_object_path (TP_PROXY (channel)));
 
+      tp_cli_dbus_properties_call_get_all (channel, -1,
+                                     TP_IFACE_CHANNEL_INTERFACE_SUBJECT,
+                                     (tp_properties_get_all_cb)subject_get_all,
+                                     room, NULL, NULL);
+
+
       priv->identifier_notify_id =
         g_signal_connect (channel, "notify::identifier",
                           G_CALLBACK (on_identifier_notify), room);
       priv->group_contacts_changed_id =
         g_signal_connect (channel, "group-contacts-changed",
                           G_CALLBACK (on_group_contacts_changed), room);
+      priv->properties_changed_id =
+        tp_cli_dbus_properties_connect_to_properties_changed (
+                                 channel,
+                                 (tp_properties_changed_cb) properties_changed,
+                                 room, NULL, NULL, NULL);
     }
 
     g_object_freeze_notify (G_OBJECT (room));
@@ -285,6 +352,9 @@ polari_room_get_property (GObject    *object,
     case PROP_DISPLAY_NAME:
       g_value_set_string (value, priv->display_name);
       break;
+    case PROP_TOPIC:
+      g_value_set_string (value, priv->topic);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -352,6 +422,13 @@ polari_room_class_init (PolariRoomClass *klass)
                          NULL,
                          G_PARAM_READABLE);
 
+  props[PROP_TOPIC] =
+    g_param_spec_string ("topic",
+                         "Topic",
+                         "Topic",
+                         NULL,
+                         G_PARAM_READABLE);
+
   props[PROP_ICON] =
     g_param_spec_object ("icon",
                          "Icon",
diff --git a/src/mainWindow.js b/src/mainWindow.js
index dfe3965..ffca056 100644
--- a/src/mainWindow.js
+++ b/src/mainWindow.js
@@ -49,6 +49,7 @@ const MainWindow = new Lang.Class({
         this._account = null;
 
         this._displayNameChangedId = 0;
+        this._topicChangedId = 0;
         this._nicknameChangedId = 0;
         this._channelChangedId = 0;
 
@@ -134,9 +135,11 @@ const MainWindow = new Lang.Class({
     _activeRoomChanged: function(manager, room) {
         if (this._room) {
             this._room.disconnect(this._displayNameChangedId);
+            this._room.disconnect(this._topicChangedId);
             this._room.disconnect(this._channelChangedId);
         }
         this._displayNameChangedId = 0;
+        this._topicChangedId = 0;
         this._channelChangedId = 0;
 
         this._room = room;
@@ -145,6 +148,9 @@ const MainWindow = new Lang.Class({
             this._displayNameChangedId =
                 this._room.connect('notify::display-name',
                                    Lang.bind(this, this._updateTitlebar));
+            this._topicChangedId =
+                this._room.connect('notify::topic',
+                                   Lang.bind(this, this._updateTitlebar));
             this._channelChangedId =
                 this._room.connect('notify::channel',
                                    Lang.bind(this, this._updateAccount));
@@ -199,6 +205,7 @@ const MainWindow = new Lang.Class({
 
     _updateTitlebar: function() {
         this._titlebar.title = this._room ? this._room.display_name : null;
+        this._titlebar.subtitle = this._room ? this._room.topic : null;
     },
 
     _updateAccount: function() {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]