]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-chat-window.c
Cleanup chat objects API and request a new Text channel if account gets
[empathy.git] / libempathy-gtk / empathy-chat-window.c
index 29fe5a521c9b7d78d41600030e0507f966696f8d..b4475ff7ab64aea3c73f43add9ed6ae479f4af8f 100644 (file)
@@ -34,6 +34,8 @@
 #include <glade/glade.h>
 #include <glib/gi18n.h>
 
+#include <libmissioncontrol/mission-control.h>
+
 #include <libempathy/empathy-contact-factory.h>
 #include <libempathy/empathy-contact-list.h>
 #include <libempathy/empathy-log-manager.h>
@@ -60,8 +62,6 @@
 
 #define DEBUG_DOMAIN "ChatWindow"
 
-#define URGENCY_TIMEOUT 60*1000
-
 struct _EmpathyChatWindowPriv {
        EmpathyChatroomManager *chatroom_manager;
        GList                 *chats;
@@ -73,13 +73,9 @@ struct _EmpathyChatWindowPriv {
        gboolean               page_added;
        gboolean               dnd_same_window;
 
-       guint                  urgency_timeout_id;
-
        GtkWidget             *dialog;
        GtkWidget             *notebook;
 
-       GtkTooltips           *tooltips;
-
        /* Menu items. */
        GtkWidget             *menu_conv_clear;
        GtkWidget             *menu_conv_insert_smiley;
@@ -281,8 +277,6 @@ empathy_chat_window_init (EmpathyChatWindow *window)
 
        priv = GET_PRIV (window);
 
-       priv->tooltips = g_object_ref_sink (gtk_tooltips_new ());
-
        glade = empathy_glade_get_file ("empathy-chat.glade",
                                       "chat_window",
                                       NULL,
@@ -349,7 +343,7 @@ empathy_chat_window_init (EmpathyChatWindow *window)
                                  window);
 
        priv->notebook = gtk_notebook_new ();
-       gtk_notebook_set_group_id (GTK_NOTEBOOK (priv->notebook), 1); 
+       gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow"); 
        gtk_box_pack_start (GTK_BOX (chat_vbox), priv->notebook, TRUE, TRUE, 0);
        gtk_widget_show (priv->notebook);
 
@@ -381,8 +375,7 @@ empathy_chat_window_init (EmpathyChatWindow *window)
        /* Set up smiley menu */
        menu = empathy_chat_view_get_smiley_menu (
                G_CALLBACK (chat_window_insert_smiley_activate_cb),
-               window,
-               priv->tooltips);
+               window);
        gtk_menu_item_set_submenu (GTK_MENU_ITEM (priv->menu_conv_insert_smiley), menu);
 
        /* Set up signals we can't do with glade since we may need to
@@ -510,13 +503,8 @@ empathy_chat_window_finalize (GObject *object)
                g_source_remove (priv->save_geometry_id);
        }
 
-       if (priv->urgency_timeout_id != 0) {
-               g_source_remove (priv->urgency_timeout_id);
-       }
-
        chat_windows = g_list_remove (chat_windows, window);
        gtk_widget_destroy (priv->dialog);
-       g_object_unref (priv->tooltips);
 
        g_signal_handlers_disconnect_by_func (priv->chatroom_manager,
                                              chat_window_update_menu,
@@ -763,8 +751,8 @@ chat_window_update_menu (EmpathyChatWindow *window)
                 * connected to the room?
                 */
                chatroom = empathy_chatroom_manager_find (priv->chatroom_manager,
-                                                        priv->current_chat->account,
-                                                        empathy_chat_get_id (priv->current_chat));
+                                                         empathy_chat_get_account (priv->current_chat),
+                                                         empathy_chat_get_id (priv->current_chat));
 
                gtk_widget_set_sensitive (priv->menu_room_add, chatroom == NULL);
                gtk_widget_set_sensitive (priv->menu_conv_insert_smiley, is_connected);
@@ -883,9 +871,7 @@ chat_window_call_activate_cb (GtkWidget         *menuitem,
                chat = EMPATHY_PRIVATE_CHAT (priv->current_chat);
                contact = empathy_private_chat_get_contact (chat);
 
-               /* FIXME: See contact_list_view_voip_activated() to know how to
-                * call a contact. We need a function to call a contact and use
-                * it here and in EmpathyContactListView. */
+               empathy_call_contact (contact);
        }
 }
 
@@ -897,10 +883,10 @@ chat_window_log_activate_cb (GtkWidget        *menuitem,
 
        priv = GET_PRIV (window);
 
-       empathy_log_window_show (priv->current_chat->account,
-                               empathy_chat_get_id (priv->current_chat),
-                               empathy_chat_is_group_chat (priv->current_chat),
-                               GTK_WINDOW (priv->dialog));
+       empathy_log_window_show (empathy_chat_get_account (priv->current_chat),
+                                empathy_chat_get_id (priv->current_chat),
+                                empathy_chat_is_group_chat (priv->current_chat),
+                                GTK_WINDOW (priv->dialog));
 }
 
 static void
@@ -916,7 +902,7 @@ chat_window_info_activate_cb (GtkWidget        *menuitem,
 
        empathy_contact_information_dialog_show (contact,
                                                 GTK_WINDOW (priv->dialog),
-                                                FALSE);
+                                                FALSE, FALSE);
 }
 
 static gboolean
@@ -956,9 +942,9 @@ chat_window_configure_event_cb (GtkWidget         *widget,
        }
 
        priv->save_geometry_id =
-               g_timeout_add (500,
-                              (GSourceFunc) chat_window_save_geometry_timeout_cb,
-                              window);
+               g_timeout_add_seconds (1,
+                                      (GSourceFunc) chat_window_save_geometry_timeout_cb,
+                                      window);
 
        return FALSE;
 }
@@ -976,7 +962,7 @@ chat_window_conv_activate_cb (GtkWidget         *menuitem,
 
        manager = empathy_log_manager_new ();
        log_exists = empathy_log_manager_exists (manager,
-                                                priv->current_chat->account,
+                                                empathy_chat_get_account (priv->current_chat),
                                                 empathy_chat_get_id (priv->current_chat),
                                                 empathy_chat_is_group_chat (priv->current_chat));
        g_object_unref (manager);
@@ -991,8 +977,12 @@ chat_window_conv_activate_cb (GtkWidget         *menuitem,
        }
 
        gtk_widget_set_sensitive (priv->menu_conv_log, log_exists);
-       g_object_set (priv->menu_conv_call, "visible", can_voip, NULL);
-       g_object_set (priv->menu_conv_call_separator, "visible", can_voip, NULL);
+#ifdef HAVE_VOIP
+       gtk_widget_set_sensitive (priv->menu_conv_call, can_voip);
+#else 
+       g_object_set (priv->menu_conv_call, "visible", FALSE, NULL);
+       g_object_set (priv->menu_conv_call_separator, "visible", FALSE, NULL);
+#endif
 }
 
 static void
@@ -1089,10 +1079,10 @@ chat_window_room_add_activate_cb (GtkWidget        *menuitem,
                return;
        }
 
-       chatroom = empathy_chatroom_new_full (priv->current_chat->account,
-                                            empathy_chat_get_id (priv->current_chat),
-                                            empathy_chat_get_name (priv->current_chat),
-                                            FALSE);
+       chatroom = empathy_chatroom_new_full (empathy_chat_get_account (priv->current_chat),
+                                             empathy_chat_get_id (priv->current_chat),
+                                             empathy_chat_get_name (priv->current_chat),
+                                             FALSE);
 
        manager = empathy_chatroom_manager_new ();
        empathy_chatroom_manager_add (manager, chatroom);
@@ -1297,10 +1287,7 @@ chat_window_update_tooltip (EmpathyChatWindow *window,
        }
 
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget");
-       gtk_tooltips_set_tip (priv->tooltips,
-                             widget,
-                             str,
-                             NULL);
+       gtk_widget_set_tooltip_text (widget, str);
 
        g_free (str);
 }
@@ -1586,7 +1573,6 @@ chat_window_drag_data_received (GtkWidget        *widget,
                                guint             time,
                                EmpathyChatWindow *window)
 {
-       /* FIXME: DnD of contact do not seems to work... */
        if (info == DND_DRAG_TYPE_CONTACT_ID) {
                EmpathyContactFactory *factory;
                EmpathyContact        *contact = NULL;
@@ -1622,8 +1608,22 @@ chat_window_drag_data_received (GtkWidget        *widget,
                
                account = empathy_contact_get_account (contact);
                chat = empathy_chat_window_find_chat (account, id);
-               old_window = empathy_chat_get_window (chat);
-               
+
+               if (!chat) {
+                       MissionControl *mc;
+
+                       mc = empathy_mission_control_new ();
+                       mission_control_request_channel (mc,
+                                                        empathy_contact_get_account (contact),
+                                                        TP_IFACE_CHANNEL_TYPE_TEXT,
+                                                        empathy_contact_get_handle (contact),
+                                                        TP_HANDLE_TYPE_CONTACT,
+                                                        NULL, NULL);
+                       g_object_unref (mc);
+                       return;
+               }
+
+               old_window = empathy_chat_get_window (chat);            
                if (old_window) {
                        if (old_window == window) {
                                gtk_drag_finish (context, TRUE, FALSE, time);
@@ -1688,21 +1688,6 @@ chat_window_drag_data_received (GtkWidget        *widget,
        }
 }
 
-static gboolean
-chat_window_urgency_timeout_func (EmpathyChatWindow *window)
-{
-       EmpathyChatWindowPriv *priv;
-
-       priv = GET_PRIV (window);
-
-       empathy_debug (DEBUG_DOMAIN, "Turning off urgency hint");
-       gtk_window_set_urgency_hint (GTK_WINDOW (priv->dialog), FALSE);
-
-       priv->urgency_timeout_id = 0;
-
-       return FALSE;
-}
-
 static void
 chat_window_set_urgency_hint (EmpathyChatWindow *window,
                              gboolean          urgent)
@@ -1711,29 +1696,9 @@ chat_window_set_urgency_hint (EmpathyChatWindow *window,
 
        priv = GET_PRIV (window);
 
-       if (!urgent) {
-               /* Remove any existing hint and timeout. */
-               if (priv->urgency_timeout_id) {
-                       empathy_debug (DEBUG_DOMAIN, "Turning off urgency hint");
-                       gtk_window_set_urgency_hint (GTK_WINDOW (priv->dialog), FALSE);
-                       g_source_remove (priv->urgency_timeout_id);
-                       priv->urgency_timeout_id = 0;
-               }
-               return;
-       }
-
-       /* Add a new hint and renew any exising timeout or add a new one. */
-       if (priv->urgency_timeout_id) {
-               g_source_remove (priv->urgency_timeout_id);
-       } else {
-               empathy_debug (DEBUG_DOMAIN, "Turning on urgency hint");
-               gtk_window_set_urgency_hint (GTK_WINDOW (priv->dialog), TRUE);
-       }
-
-       priv->urgency_timeout_id = g_timeout_add (
-               URGENCY_TIMEOUT,
-               (GSourceFunc) chat_window_urgency_timeout_func,
-               window);
+       empathy_debug (DEBUG_DOMAIN, "Turning %s urgency hint",
+                      urgent ? "on" : "off");
+       gtk_window_set_urgency_hint (GTK_WINDOW (priv->dialog), urgent);
 }
 
 EmpathyChatWindow *
@@ -1756,12 +1721,15 @@ empathy_chat_window_get_dialog (EmpathyChatWindow *window)
 
 void
 empathy_chat_window_add_chat (EmpathyChatWindow *window,
-                            EmpathyChat              *chat)
+                             EmpathyChat       *chat)
 {
        EmpathyChatWindowPriv *priv;
        GtkWidget            *label;
        GtkWidget            *child;
 
+       g_return_if_fail (window != NULL);
+       g_return_if_fail (EMPATHY_IS_CHAT (chat));
+
        priv = GET_PRIV (window);
 
        /* Reference the chat object */
@@ -1806,11 +1774,14 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
 
 void
 empathy_chat_window_remove_chat (EmpathyChatWindow *window,
-                               EmpathyChat      *chat)
+                                EmpathyChat       *chat)
 {
        EmpathyChatWindowPriv *priv;
        gint                  position;
 
+       g_return_if_fail (window != NULL);
+       g_return_if_fail (EMPATHY_IS_CHAT (chat));
+
        priv = GET_PRIV (window);
 
        position = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook),
@@ -1826,8 +1797,8 @@ empathy_chat_window_remove_chat (EmpathyChatWindow *window,
 
 void
 empathy_chat_window_move_chat (EmpathyChatWindow *old_window,
-                             EmpathyChatWindow *new_window,
-                             EmpathyChat       *chat)
+                              EmpathyChatWindow *new_window,
+                              EmpathyChat       *chat)
 {
        GtkWidget *widget;
 
@@ -1857,11 +1828,14 @@ empathy_chat_window_move_chat (EmpathyChatWindow *old_window,
 
 void
 empathy_chat_window_switch_to_chat (EmpathyChatWindow *window,
-                                  EmpathyChat      *chat)
+                                   EmpathyChat       *chat)
 {
        EmpathyChatWindowPriv *priv;
        gint                  page_num;
 
+       g_return_if_fail (window != NULL);
+       g_return_if_fail (EMPATHY_IS_CHAT (chat));
+
        priv = GET_PRIV (window);
 
        page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook),
@@ -1887,10 +1861,13 @@ empathy_chat_window_has_focus (EmpathyChatWindow *window)
 
 EmpathyChat *
 empathy_chat_window_find_chat (McAccount   *account,
-                             const gchar *id)
+                              const gchar *id)
 {
        GList *l;
 
+       g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
+       g_return_val_if_fail (!G_STR_EMPTY (id), NULL);
+
        for (l = chat_windows; l; l = l->next) {
                EmpathyChatWindowPriv *priv;
                EmpathyChatWindow     *window;
@@ -1904,7 +1881,7 @@ empathy_chat_window_find_chat (McAccount   *account,
 
                        chat = ll->data;
 
-                       if (empathy_account_equal (account, chat->account) &&
+                       if (empathy_account_equal (account, empathy_chat_get_account (chat)) &&
                            strcmp (id, empathy_chat_get_id (chat)) == 0) {
                                return chat;
                        }