From d95165b819c15207ad0a133ea38684043a3776fc Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Sun, 28 Feb 2010 19:08:43 +0000 Subject: Add chat manager which tracks chats closing and can respawn them (bug #609832) Signed-off-by: Jonny Lamb --- src/empathy-chat-window.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/empathy-chat-window.c') diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index 2e2f5c003..50543f2e8 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -54,6 +54,7 @@ #include #include +#include "empathy-chat-manager.h" #include "empathy-chat-window.h" #include "empathy-about-dialog.h" #include "empathy-invite-participant-dialog.h" @@ -1058,6 +1059,19 @@ chat_window_tabs_previous_activate_cb (GtkAction *action, gtk_notebook_prev_page (GTK_NOTEBOOK (priv->notebook)); } +static void +chat_window_tabs_undo_close_tab_activate_cb (GtkAction *action, + EmpathyChatWindow *window) +{ + EmpathyChatManager *chat_manager; + + chat_manager = empathy_chat_manager_dup_singleton (); + + empathy_chat_manager_undo_closed_chat (chat_manager); + + g_object_unref (chat_manager); +} + static void chat_window_tabs_left_activate_cb (GtkAction *action, EmpathyChatWindow *window) @@ -1850,6 +1864,7 @@ empathy_chat_window_init (EmpathyChatWindow *window) "menu_edit_find", "activate", chat_window_find_activate_cb, "menu_tabs_next", "activate", chat_window_tabs_next_activate_cb, "menu_tabs_prev", "activate", chat_window_tabs_previous_activate_cb, + "menu_tabs_undo_close_tab", "activate", chat_window_tabs_undo_close_tab_activate_cb, "menu_tabs_left", "activate", chat_window_tabs_left_activate_cb, "menu_tabs_right", "activate", chat_window_tabs_right_activate_cb, "menu_tabs_detach", "activate", chat_window_detach_activate_cb, @@ -2099,6 +2114,7 @@ empathy_chat_window_remove_chat (EmpathyChatWindow *window, EmpathyChatWindowPriv *priv; gint position; EmpathyContact *remote_contact; + EmpathyChatManager *chat_manager; g_return_if_fail (window != NULL); g_return_if_fail (EMPATHY_IS_CHAT (chat)); @@ -2114,6 +2130,10 @@ empathy_chat_window_remove_chat (EmpathyChatWindow *window, g_signal_handlers_disconnect_by_func (remote_contact, chat_window_update_chat_tab, chat); + + chat_manager = empathy_chat_manager_dup_singleton (); + empathy_chat_manager_closed_chat (chat_manager, remote_contact); + g_object_unref (chat_manager); } position = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), -- cgit v1.2.3 From 7415009e9f118174703834d95b91653f8de4e3f4 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Mon, 1 Mar 2010 11:31:52 +0000 Subject: Add EmpathyChatManager::chats-changed signal and make the chat window listen to it. Signed-off-by: Jonny Lamb --- src/empathy-chat-window.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'src/empathy-chat-window.c') diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index 50543f2e8..1df42f14a 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -85,6 +85,9 @@ typedef struct { GtkTargetList *contact_targets; GtkTargetList *file_targets; + EmpathyChatManager *chat_manager; + gulong chat_manager_chats_changed_id; + /* Menu items. */ GtkUIManager *ui_manager; GtkAction *menu_conv_insert_smiley; @@ -98,6 +101,7 @@ typedef struct { GtkAction *menu_tabs_next; GtkAction *menu_tabs_prev; + GtkAction *menu_tabs_undo_close_tab; GtkAction *menu_tabs_left; GtkAction *menu_tabs_right; GtkAction *menu_tabs_detach; @@ -1063,13 +1067,8 @@ static void chat_window_tabs_undo_close_tab_activate_cb (GtkAction *action, EmpathyChatWindow *window) { - EmpathyChatManager *chat_manager; - - chat_manager = empathy_chat_manager_dup_singleton (); - - empathy_chat_manager_undo_closed_chat (chat_manager); - - g_object_unref (chat_manager); + EmpathyChatWindowPriv *priv = GET_PRIV (window); + empathy_chat_manager_undo_closed_chat (priv->chat_manager); } static void @@ -1753,6 +1752,17 @@ chat_window_drag_data_received (GtkWidget *widget, } } +static void +chat_window_chat_manager_chats_changed_cb (EmpathyChatManager *chat_manager, + guint num_chats_in_manager, + EmpathyChatWindow *window) +{ + EmpathyChatWindowPriv *priv = GET_PRIV (window); + + gtk_action_set_sensitive (priv->menu_tabs_undo_close_tab, + num_chats_in_manager > 0); +} + static void chat_window_finalize (GObject *object) { @@ -1786,6 +1796,13 @@ chat_window_finalize (GObject *object) gtk_target_list_unref (priv->file_targets); } + if (priv->chat_manager) { + g_signal_handler_disconnect (priv->chat_manager, + priv->chat_manager_chats_changed_id); + g_object_unref (priv->chat_manager); + priv->chat_manager = NULL; + } + chat_windows = g_list_remove (chat_windows, window); gtk_widget_destroy (priv->dialog); @@ -1844,6 +1861,7 @@ empathy_chat_window_init (EmpathyChatWindow *window) "menu_edit_find", &priv->menu_edit_find, "menu_tabs_next", &priv->menu_tabs_next, "menu_tabs_prev", &priv->menu_tabs_prev, + "menu_tabs_undo_close_tab", &priv->menu_tabs_undo_close_tab, "menu_tabs_left", &priv->menu_tabs_left, "menu_tabs_right", &priv->menu_tabs_right, "menu_tabs_detach", &priv->menu_tabs_detach, @@ -1972,6 +1990,16 @@ empathy_chat_window_init (EmpathyChatWindow *window) priv->current_chat = NULL; priv->notify_mgr = empathy_notify_manager_dup_singleton (); + + priv->chat_manager = empathy_chat_manager_dup_singleton (); + priv->chat_manager_chats_changed_id = + g_signal_connect (priv->chat_manager, "chats-changed", + G_CALLBACK (chat_window_chat_manager_chats_changed_cb), + window); + + chat_window_chat_manager_chats_changed_cb (priv->chat_manager, + empathy_chat_manager_get_num_chats (priv->chat_manager), + window); } EmpathyChatWindow * -- cgit v1.2.3 From d8dd568c2c1fed4cb328c2a9afc148186fda12aa Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Sat, 6 Mar 2010 10:58:11 +0000 Subject: chat-manager: take an EmpathyChat instead of an EmpathyContact This way, we can support both 1-to-1 chats, *and* MUCs. Signed-off-by: Jonny Lamb --- src/empathy-chat-window.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/empathy-chat-window.c') diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index 1df42f14a..9748b61c6 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -2158,12 +2158,12 @@ empathy_chat_window_remove_chat (EmpathyChatWindow *window, g_signal_handlers_disconnect_by_func (remote_contact, chat_window_update_chat_tab, chat); - - chat_manager = empathy_chat_manager_dup_singleton (); - empathy_chat_manager_closed_chat (chat_manager, remote_contact); - g_object_unref (chat_manager); } + chat_manager = empathy_chat_manager_dup_singleton (); + empathy_chat_manager_closed_chat (chat_manager, chat); + g_object_unref (chat_manager); + position = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (chat)); gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), position); -- cgit v1.2.3