aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-log-window.c188
1 files changed, 76 insertions, 112 deletions
diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c
index 50c6ab049..178c445fd 100644
--- a/libempathy-gtk/empathy-log-window.c
+++ b/libempathy-gtk/empathy-log-window.c
@@ -88,6 +88,8 @@ typedef struct
TplActionChain *chain;
TplLogManager *log_manager;
+ EmpathyContact *selected_contact;
+
/* Used to cancel logger calls when no longer needed */
guint count;
@@ -295,132 +297,39 @@ static void
toolbutton_profile_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- TplEntity *target;
- EmpathyContact *contact;
- gint type;
-
g_return_if_fail (window != NULL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_TARGET, &target,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
-
- contact = empathy_contact_from_tpl_contact (account, target);
- empathy_contact_information_dialog_show (contact,
+ empathy_contact_information_dialog_show (window->selected_contact,
GTK_WINDOW (window->window));
- g_object_unref (contact);
-
- g_object_unref (account);
- g_object_unref (target);
}
static void
toolbutton_chat_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- TplEntity *target;
- EmpathyContact *contact;
- gint type;
-
g_return_if_fail (window != NULL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_TARGET, &target,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
-
- contact = empathy_contact_from_tpl_contact (account, target);
- empathy_chat_with_contact (contact,
+ empathy_chat_with_contact (window->selected_contact,
gtk_get_current_event_time ());
-
- g_object_unref (contact);
- g_object_unref (account);
- g_object_unref (target);
}
static void
toolbutton_av_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- gchar *contact;
- gint type;
gboolean video;
g_return_if_fail (window != NULL);
-
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_NAME, &contact,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
video = (GTK_WIDGET (toolbutton) == window->button_video);
- empathy_call_new_with_streams (contact, account,
+ empathy_call_new_with_streams (
+ empathy_contact_get_id (window->selected_contact),
+ empathy_contact_get_account (window->selected_contact),
TRUE, video, gtk_get_current_event_time ());
-
- g_free (contact);
- g_object_unref (account);
}
GtkWidget *
@@ -580,6 +489,7 @@ log_window_destroy_cb (GtkWidget *widget,
_tpl_action_chain_free (window->chain);
g_object_unref (window->log_manager);
tp_clear_object (&window->selected_account);
+ tp_clear_object (&window->selected_contact);
g_free (window->selected_chat_id);
g_free (window);
@@ -1563,11 +1473,11 @@ log_window_search_entry_icon_pressed_cb (GtkEntry *entry,
}
static void
-log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
- GtkTreeModel *model,
- GtkTreeSelection *selection)
+log_window_update_buttons_sensitivity (EmpathyLogWindow *window)
{
- EmpathyContact *contact;
+ GtkTreeView *view;
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
EmpathyCapabilities capabilities;
TpAccount *account;
TplEntity *target;
@@ -1576,16 +1486,22 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
GtkTreePath *path;
gboolean profile, chat, call, video;
+ tp_clear_object (&window->selected_contact);
+
+ view = GTK_TREE_VIEW (log_window->treeview_who);
+ model = gtk_tree_view_get_model (view);
+ selection = gtk_tree_view_get_selection (view);
+
profile = chat = call = video = FALSE;
if (!gtk_tree_model_get_iter_first (model, &iter))
- goto out;
+ goto events;
if (gtk_tree_selection_count_selected_rows (selection) != 1)
- goto out;
+ goto events;
if (gtk_tree_selection_iter_is_selected (selection, &iter))
- goto out;
+ goto events;
paths = gtk_tree_selection_get_selected_rows (selection, &model);
g_return_if_fail (paths != NULL);
@@ -1599,12 +1515,46 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
- contact = empathy_contact_from_tpl_contact (account, target);
+ window->selected_contact = empathy_contact_from_tpl_contact (account,
+ target);
+
+ g_object_unref (account);
+ g_object_unref (target);
+
+ capabilities = empathy_contact_get_capabilities (window->selected_contact);
+
+ profile = chat = TRUE;
+ call = capabilities & EMPATHY_CAPABILITIES_AUDIO;
+ video = capabilities & EMPATHY_CAPABILITIES_VIDEO;
+
+ goto out;
+
+ events:
+ /* If the Who pane doesn't contain a contact (e.g. it has many
+ * selected, or has 'Anyone', let's try to get the contact from
+ * the selected event. */
+ view = GTK_TREE_VIEW (log_window->treeview_events);
+ model = gtk_tree_view_get_model (view);
+ selection = gtk_tree_view_get_selection (view);
+
+ if (gtk_tree_selection_count_selected_rows (selection) != 1)
+ goto out;
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
+ goto out;
+
+ gtk_tree_model_get (model, &iter,
+ COL_EVENTS_ACCOUNT, &account,
+ COL_EVENTS_TARGET, &target,
+ -1);
+
+ window->selected_contact = empathy_contact_from_tpl_contact (account,
+ target);
g_object_unref (account);
g_object_unref (target);
- capabilities = empathy_contact_get_capabilities (contact);
+ capabilities = empathy_contact_get_capabilities (window->selected_contact);
profile = chat = TRUE;
call = capabilities & EMPATHY_CAPABILITIES_AUDIO;
@@ -1648,7 +1598,7 @@ log_window_who_changed_cb (GtkTreeSelection *selection,
}
}
- log_window_update_buttons_sensitivity (window, model, selection);
+ log_window_update_buttons_sensitivity (window);
/* The contact changed, so the dates need to be updated */
log_window_chats_get_messages (window, TRUE);
@@ -1908,6 +1858,15 @@ who_row_is_separator (GtkTreeModel *model,
}
static void
+log_window_events_changed_cb (GtkTreeSelection *selection,
+ EmpathyLogWindow *window)
+{
+ DEBUG ("log_window_events_changed_cb");
+
+ log_window_update_buttons_sensitivity (window);
+}
+
+static void
log_window_events_setup (EmpathyLogWindow *window)
{
GtkTreeView *view;
@@ -1959,7 +1918,7 @@ log_window_events_setup (EmpathyLogWindow *window)
gtk_tree_view_append_column (view, column);
/* set up treeview properties */
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
gtk_tree_view_set_headers_visible (view, FALSE);
gtk_tree_sortable_set_sort_column_id (sortable,
@@ -1968,6 +1927,11 @@ log_window_events_setup (EmpathyLogWindow *window)
gtk_tree_view_set_enable_search (view, FALSE);
+ /* set up signals */
+ g_signal_connect (selection, "changed",
+ G_CALLBACK (log_window_events_changed_cb),
+ window);
+
g_object_unref (store);
}