aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-chat.c68
-rw-r--r--libempathy-gtk/empathy-chat.h2
-rw-r--r--src/empathy-chat-window.c50
3 files changed, 61 insertions, 59 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 69ada3a81..ab31c608e 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -69,6 +69,7 @@ typedef struct {
gchar *name;
gchar *subject;
EmpathyContact *remote_contact;
+ gboolean show_contacts;
EmpathyLogManager *log_manager;
EmpathyAccountManager *account_manager;
@@ -81,7 +82,6 @@ typedef struct {
TpHandleType handle_type;
gint contacts_width;
gboolean has_input_vscroll;
- guint notify_id; /* show contacts' notification */
GtkWidget *widget;
GtkWidget *hpaned;
@@ -108,6 +108,7 @@ enum {
PROP_NAME,
PROP_SUBJECT,
PROP_REMOTE_CONTACT,
+ PROP_SHOW_CONTACTS,
};
static guint signals[LAST_SIGNAL] = { 0 };
@@ -142,6 +143,9 @@ chat_get_property (GObject *object,
case PROP_REMOTE_CONTACT:
g_value_set_object (value, priv->remote_contact);
break;
+ case PROP_SHOW_CONTACTS:
+ g_value_set_boolean (value, priv->show_contacts);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -160,6 +164,9 @@ chat_set_property (GObject *object,
case PROP_TP_CHAT:
empathy_chat_set_tp_chat (chat, EMPATHY_TP_CHAT (g_value_get_object (value)));
break;
+ case PROP_SHOW_CONTACTS:
+ empathy_chat_set_show_contacts (chat, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -1188,21 +1195,19 @@ chat_reset_size_request (gpointer widget)
return FALSE;
}
-static void
-chat_set_show_contacts (EmpathyChat *chat, gboolean show)
+void
+empathy_chat_set_show_contacts (EmpathyChat *chat,
+ gboolean show)
{
- gboolean conf_show;
EmpathyChatPriv *priv = GET_PRIV (chat);
+
+ priv->show_contacts = show;
if (!priv->scrolled_window_contacts) {
return;
- }
+ }
- empathy_conf_get_bool (empathy_conf_get (),
- EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
- &conf_show);
-
- if (show && conf_show) {
+ if (show) {
EmpathyContactListStore *store;
gint min_width;
@@ -1244,21 +1249,10 @@ chat_set_show_contacts (EmpathyChat *chat, gboolean show)
}
static void
-chat_notify_show_contacts_cb (EmpathyConf *conf,
- const gchar *key,
- gpointer user_data)
-{
- EmpathyChatPriv *priv;
-
- priv = GET_PRIV (user_data);
-
- chat_set_show_contacts (EMPATHY_CHAT (user_data), priv->remote_contact == NULL);
-}
-
-static void
chat_remote_contact_changed_cb (EmpathyChat *chat)
{
EmpathyChatPriv *priv = GET_PRIV (chat);
+ gboolean active;
if (priv->remote_contact != NULL) {
g_object_unref (priv->remote_contact);
@@ -1281,7 +1275,8 @@ chat_remote_contact_changed_cb (EmpathyChat *chat)
priv->id = g_strdup (empathy_tp_chat_get_id (priv->tp_chat));
}
- chat_set_show_contacts (chat, priv->remote_contact == NULL);
+ active = (priv->remote_contact == NULL && priv->show_contacts == TRUE);
+ empathy_chat_set_show_contacts (chat, active);
g_object_notify (G_OBJECT (chat), "remote-contact");
g_object_notify (G_OBJECT (chat), "id");
@@ -1306,7 +1301,7 @@ chat_destroy_cb (EmpathyTpChat *tp_chat,
empathy_chat_view_append_event (chat->view, _("Disconnected"));
gtk_widget_set_sensitive (chat->input_text_view, FALSE);
- chat_set_show_contacts (chat, FALSE);
+ empathy_chat_set_show_contacts (chat, FALSE);
}
static void
@@ -1334,6 +1329,7 @@ chat_create_ui (EmpathyChat *chat)
GList *list = NULL;
gchar *filename;
GtkTextBuffer *buffer;
+ gboolean active;
filename = empathy_file_lookup ("empathy-chat.ui",
"libempathy-gtk");
@@ -1391,7 +1387,8 @@ chat_create_ui (EmpathyChat *chat)
gtk_widget_show (chat->input_text_view);
/* Create contact list */
- chat_set_show_contacts (chat, priv->remote_contact == NULL);
+ active = (priv->remote_contact == NULL && priv->show_contacts == TRUE);
+ empathy_chat_set_show_contacts (chat, active);
/* Initialy hide the topic, will be shown if not empty */
gtk_widget_hide (priv->hbox_topic);
@@ -1509,8 +1506,6 @@ chat_finalize (GObject *object)
if (priv->block_events_timeout_id) {
g_source_remove (priv->block_events_timeout_id);
}
-
- empathy_conf_notify_remove (empathy_conf_get (), priv->notify_id);
g_free (priv->id);
g_free (priv->name);
@@ -1587,6 +1582,13 @@ empathy_chat_class_init (EmpathyChatClass *klass)
"The remote contact is any",
EMPATHY_TYPE_CONTACT,
G_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_CONTACTS,
+ g_param_spec_boolean ("show-contacts",
+ "Contacts' visibility",
+ "The visibility of the contacts' list",
+ TRUE,
+ G_PARAM_READWRITE));
signals[COMPOSING] =
g_signal_new ("composing",
@@ -1624,6 +1626,7 @@ chat_block_events_timeout_cb (gpointer data)
static void
empathy_chat_init (EmpathyChat *chat)
{
+ gboolean active;
EmpathyChatPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chat,
EMPATHY_TYPE_CHAT, EmpathyChatPriv);
@@ -1638,12 +1641,13 @@ empathy_chat_init (EmpathyChat *chat)
"new-connection",
G_CALLBACK (chat_new_connection_cb),
chat);
-
- priv->notify_id = empathy_conf_notify_add (empathy_conf_get (),
- EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
- chat_notify_show_contacts_cb,
- chat);
+ empathy_conf_get_bool (empathy_conf_get (),
+ EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
+ &active);
+
+ empathy_chat_set_show_contacts (chat, active);
+
/* Block events for some time to avoid having "has come online" or
* "joined" messages. */
priv->block_events_timeout_id =
diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h
index 12fac9617..c38fd64a6 100644
--- a/libempathy-gtk/empathy-chat.h
+++ b/libempathy-gtk/empathy-chat.h
@@ -82,6 +82,8 @@ void empathy_chat_correct_word (EmpathyChat *chat,
GtkTextIter *end,
const gchar *new_word);
gboolean empathy_chat_is_room (EmpathyChat *chat);
+void empathy_chat_set_show_contacts (EmpathyChat *chat,
+ gboolean show);
G_END_DECLS
#endif /* __EMPATHY_CHAT_H__ */
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 03e4c1059..130638a1a 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -72,7 +72,6 @@ typedef struct {
GtkWidget *dialog;
GtkWidget *notebook;
NotifyNotification *notification;
- guint notify_id; /* show contacts' notification */
/* Menu items. */
GtkUIManager *ui_manager;
@@ -135,21 +134,6 @@ chat_window_accel_cb (GtkAccelGroup *accelgroup,
}
}
-static void
-chat_window_notify_show_contacts_cb (EmpathyConf *conf,
- const gchar *key,
- gpointer user_data)
-{
- gboolean value;
- EmpathyChatWindowPriv *priv;
-
- priv = GET_PRIV (user_data);
-
- if (empathy_conf_get_bool (empathy_conf_get (), key, &value)) {
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (priv->menu_conv_toggle_contacts), value);
- }
-}
-
static EmpathyChatWindow *
chat_window_find_chat (EmpathyChat *chat)
{
@@ -564,6 +548,8 @@ chat_window_conv_activate_cb (GtkAction *action,
{
EmpathyChatWindowPriv *priv = GET_PRIV (window);
gboolean is_room;
+ gboolean active;
+ EmpathyContact *remote_contact = NULL;
/* Favorite room menu */
is_room = empathy_chat_is_room (priv->current_chat);
@@ -582,7 +568,22 @@ chat_window_conv_activate_cb (GtkAction *action,
GTK_TOGGLE_ACTION (priv->menu_conv_favorite), found);
}
gtk_action_set_visible (priv->menu_conv_favorite, is_room);
- gtk_action_set_visible (priv->menu_conv_toggle_contacts, is_room);
+
+ /* Show contacts menu */
+ g_object_get (priv->current_chat,
+ "remote-contact", &remote_contact,
+ "show-contacts", &active,
+ NULL);
+ if (remote_contact == NULL) {
+ gtk_toggle_action_set_active (
+ GTK_TOGGLE_ACTION (priv->menu_conv_toggle_contacts),
+ active);
+ }
+ gtk_action_set_visible (priv->menu_conv_toggle_contacts,
+ (remote_contact == NULL));
+ if (remote_contact != NULL) {
+ g_object_unref (remote_contact);
+ }
}
static void
@@ -630,13 +631,14 @@ static void
chat_window_contacts_toggled_cb (GtkToggleAction *toggle_action,
EmpathyChatWindow *window)
{
+ EmpathyChatWindowPriv *priv = GET_PRIV (window);
gboolean active;
active = gtk_toggle_action_get_active (toggle_action);
-
- empathy_conf_set_bool (empathy_conf_get (),
- EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
- active);
+
+ g_object_set (priv->current_chat,
+ "show-contacts", active,
+ NULL);
}
static const gchar *
@@ -1350,8 +1352,6 @@ chat_window_finalize (GObject *object)
chat_windows = g_list_remove (chat_windows, window);
gtk_widget_destroy (priv->dialog);
-
- empathy_conf_notify_remove (empathy_conf_get (), priv->notify_id);
G_OBJECT_CLASS (empathy_chat_window_parent_class)->finalize (object);
}
@@ -1504,10 +1504,6 @@ empathy_chat_window_init (EmpathyChatWindow *window)
"page_removed",
G_CALLBACK (chat_window_page_removed_cb),
window);
- priv->notify_id = empathy_conf_notify_add (empathy_conf_get (),
- EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
- chat_window_notify_show_contacts_cb,
- window);
/* Set up drag and drop */
gtk_drag_dest_set (GTK_WIDGET (priv->notebook),