[polari] mainWindow: Display topic
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari] mainWindow: Display topic
- Date: Thu, 8 Aug 2013 13:07:46 +0000 (UTC)
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]