]> git.0d.be Git - empathy.git/blobdiff - src/empathy-chat-window.c
Improve dispatcher. Fixes bug #465928.
[empathy.git] / src / empathy-chat-window.c
index 88858dae5cbfbee4f8775df1a56489e6253c71db..1db873b5a435a9246d763fe0744939dc59ca5b24 100644 (file)
@@ -40,7 +40,7 @@
 #include <libempathy/empathy-contact-factory.h>
 #include <libempathy/empathy-contact.h>
 #include <libempathy/empathy-message.h>
-#include <libempathy/empathy-debug.h>
+#include <libempathy/empathy-dispatcher.h>
 #include <libempathy/empathy-utils.h>
 
 #include <libempathy-gtk/empathy-images.h>
 #include "empathy-chat-window.h"
 #include "empathy-about-dialog.h"
 
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_CHAT_WINDOW, EmpathyChatWindowPriv))
-
-#define DEBUG_DOMAIN "ChatWindow"
+#define DEBUG_FLAG EMPATHY_DEBUG_CHAT
+#include <libempathy/empathy-debug.h>
 
-struct _EmpathyChatWindowPriv {
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatWindow)
+typedef struct {
        EmpathyChat *current_chat;
        GList       *chats;
        GList       *chats_new_msg;
@@ -86,7 +86,7 @@ struct _EmpathyChatWindowPriv {
        
        GtkWidget   *menu_help_contents;
        GtkWidget   *menu_help_about;
-};
+} EmpathyChatWindowPriv;
 
 static GList *chat_windows = NULL;
 
@@ -297,7 +297,7 @@ chat_window_update (EmpathyChatWindow *window)
        name = chat_window_get_chat_name (priv->current_chat);
        n_chats = g_list_length (priv->chats);
 
-       empathy_debug (DEBUG_DOMAIN, "Update window");
+       DEBUG ("Update window");
 
        /* Update menu */
        gtk_widget_set_sensitive (priv->menu_tabs_next, !last_page);
@@ -351,8 +351,8 @@ chat_window_update_chat_tab (EmpathyChat *chat)
        subject = empathy_chat_get_subject (chat);
        remote_contact = empathy_chat_get_remote_contact (chat);
 
-       empathy_debug (DEBUG_DOMAIN, "Updating chat tab, name=%s, subject=%s, "
-                      "remote_contact=%p", name, subject, remote_contact);
+       DEBUG ("Updating chat tab, name=%s, subject=%s, remote_contact=%p",
+               name, subject, remote_contact);
 
        /* Update tab image */
        if (g_list_find (priv->chats_new_msg, chat)) {
@@ -453,13 +453,29 @@ chat_window_insert_smiley_activate_cb (GtkWidget         *menuitem,
                                smiley, -1);
 }
 
+static void
+chat_window_conv_activate_cb (GtkWidget         *menuitem,
+                             EmpathyChatWindow *window)
+{
+       EmpathyChatWindowPriv *priv = GET_PRIV (window);
+       GtkWidget             *submenu = NULL;
+
+       submenu = empathy_chat_get_contact_menu (priv->current_chat);
+       if (submenu) {
+               gtk_menu_item_set_submenu (GTK_MENU_ITEM (priv->menu_conv_contact),
+                                          submenu);
+               gtk_widget_show (priv->menu_conv_contact);
+               gtk_widget_show (submenu);
+       } else {
+               gtk_widget_hide (priv->menu_conv_contact);
+       }
+}
+
 static void
 chat_window_clear_activate_cb (GtkWidget        *menuitem,
                               EmpathyChatWindow *window)
 {
-       EmpathyChatWindowPriv *priv;
-
-       priv = GET_PRIV (window);
+       EmpathyChatWindowPriv *priv = GET_PRIV (window);
 
        empathy_chat_clear (priv->current_chat);
 }
@@ -691,21 +707,15 @@ chat_window_delete_event_cb (GtkWidget        *dialog,
                             GdkEvent         *event,
                             EmpathyChatWindow *window)
 {
-       EmpathyChatWindowPriv *priv;
-       GList                *list;
-       GList                *l;
-
-       priv = GET_PRIV (window);
-
-       empathy_debug (DEBUG_DOMAIN, "Delete event received");
+       EmpathyChatWindowPriv *priv = GET_PRIV (window);
 
-       list = g_list_copy (priv->chats);
+       DEBUG ("Delete event received");
 
-       for (l = list; l; l = l->next) {
-               empathy_chat_window_remove_chat (window, l->data);
+       g_object_ref (window);
+       while (priv->chats) {
+               empathy_chat_window_remove_chat (window, priv->chats->data);
        }
-
-       g_list_free (list);
+       g_object_unref (window);
 
        return TRUE;
 }
@@ -736,8 +746,7 @@ chat_window_set_urgency_hint (EmpathyChatWindow *window,
 
        priv = GET_PRIV (window);
 
-       empathy_debug (DEBUG_DOMAIN, "Turning %s urgency hint",
-                      urgent ? "on" : "off");
+       DEBUG ("Turning %s urgency hint", urgent ? "on" : "off");
        gtk_window_set_urgency_hint (GTK_WINDOW (priv->dialog), urgent);
 }
 
@@ -791,7 +800,7 @@ chat_window_detach_hook (GtkNotebook *source,
        new_window = empathy_chat_window_new ();
        priv = GET_PRIV (new_window);
 
-       empathy_debug (DEBUG_DOMAIN, "Detach hook called");
+       DEBUG ("Detach hook called");
 
        empathy_chat_window_move_chat (window, new_window, chat);
 
@@ -811,7 +820,7 @@ chat_window_page_switched_cb (GtkNotebook      *notebook,
        EmpathyChat           *chat;
        GtkWidget            *child;
 
-       empathy_debug (DEBUG_DOMAIN, "Page switched");
+       DEBUG ("Page switched");
 
        priv = GET_PRIV (window);
 
@@ -848,12 +857,12 @@ chat_window_page_added_cb (GtkNotebook      *notebook,
         * it, so we return here and in "page-added".
         */
        if (priv->dnd_same_window) {
-               empathy_debug (DEBUG_DOMAIN, "Page added (back to the same window)");
+               DEBUG ("Page added (back to the same window)");
                priv->dnd_same_window = FALSE;
                return;
        }
 
-       empathy_debug (DEBUG_DOMAIN, "Page added");
+       DEBUG ("Page added");
 
        /* Get chat object */
        chat = EMPATHY_CHAT (child);
@@ -893,11 +902,11 @@ chat_window_page_removed_cb (GtkNotebook      *notebook,
         * it, so we return here and in "page-added".
         */
        if (priv->dnd_same_window) {
-               empathy_debug (DEBUG_DOMAIN, "Page removed (and will be readded to same window)");
+               DEBUG ("Page removed (and will be readded to same window)");
                return;
        }
 
-       empathy_debug (DEBUG_DOMAIN, "Page removed");
+       DEBUG ("Page removed");
 
        /* Get chat object */
        chat = EMPATHY_CHAT (child);
@@ -929,7 +938,7 @@ chat_window_focus_in_event_cb (GtkWidget        *widget,
 {
        EmpathyChatWindowPriv *priv;
 
-       empathy_debug (DEBUG_DOMAIN, "Focus in event, updating title");
+       DEBUG ("Focus in event, updating title");
 
        priv = GET_PRIV (window);
 
@@ -962,14 +971,14 @@ chat_window_drag_data_received (GtkWidget        *widget,
 
                id = (const gchar*) selection->data;
 
-               empathy_debug (DEBUG_DOMAIN, "DND contact from roster with id:'%s'", id);
+               DEBUG ("DND contact from roster with id:'%s'", id);
                
                strv = g_strsplit (id, "/", 2);
                account = mc_account_lookup (strv[0]);
                chat = empathy_chat_window_find_chat (account, strv[1]);
 
                if (!chat) {
-                       empathy_chat_with_contact_id (account, strv[2]);
+                       empathy_dispatcher_chat_with_contact_id (account, strv[2]);
                        g_object_unref (account);
                        g_strfreev (strv);
                        return;
@@ -1003,7 +1012,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
                EmpathyChat        **chat;
                EmpathyChatWindow   *old_window = NULL;
 
-               empathy_debug (DEBUG_DOMAIN, "DND tab");
+               DEBUG ("DND tab");
 
                chat = (void*) selection->data;
                old_window = chat_window_find_chat (*chat);
@@ -1014,7 +1023,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
                        priv = GET_PRIV (window);
 
                        if (old_window == window) {
-                               empathy_debug (DEBUG_DOMAIN, "DND tab (within same window)");
+                               DEBUG ("DND tab (within same window)");
                                priv->dnd_same_window = TRUE;
                                gtk_drag_finish (context, TRUE, FALSE, time);
                                return;
@@ -1030,7 +1039,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
                 */
                gtk_drag_finish (context, TRUE, FALSE, time);
        } else {
-               empathy_debug (DEBUG_DOMAIN, "DND from unknown source");
+               DEBUG ("DND from unknown source");
                gtk_drag_finish (context, FALSE, FALSE, time);
        }
 }
@@ -1044,7 +1053,7 @@ chat_window_finalize (GObject *object)
        window = EMPATHY_CHAT_WINDOW (object);
        priv = GET_PRIV (window);
 
-       empathy_debug (DEBUG_DOMAIN, "Finalized: %p", object);
+       DEBUG ("Finalized: %p", object);
 
        if (priv->save_geometry_id != 0) {
                g_source_remove (priv->save_geometry_id);
@@ -1081,18 +1090,18 @@ empathy_chat_window_class_init (EmpathyChatWindowClass *klass)
 static void
 empathy_chat_window_init (EmpathyChatWindow *window)
 {
-       EmpathyChatWindowPriv *priv;
-       GladeXML             *glade;
-       GtkAccelGroup        *accel_group;
-       GClosure             *closure;
-       GtkWidget            *menu_conv;
-       GtkWidget            *menu;
-       gint                  i;
-       GtkWidget            *chat_vbox;
-       gchar                *filename;
-
-       priv = GET_PRIV (window);
-
+       GladeXML              *glade;
+       GtkAccelGroup         *accel_group;
+       GClosure              *closure;
+       GtkWidget             *menu_conv;
+       GtkWidget             *menu;
+       gint                   i;
+       GtkWidget             *chat_vbox;
+       gchar                 *filename;
+       EmpathyChatWindowPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (window,
+               EMPATHY_TYPE_CHAT_WINDOW, EmpathyChatWindowPriv);
+
+       window->priv = priv;
        filename = empathy_file_lookup ("empathy-chat-window.glade", "src");
        glade = empathy_glade_get_file (filename,
                                       "chat_window",
@@ -1120,6 +1129,7 @@ empathy_chat_window_init (EmpathyChatWindow *window)
        empathy_glade_connect (glade,
                              window,
                              "chat_window", "configure-event", chat_window_configure_event_cb,
+                             "menu_conv", "activate", chat_window_conv_activate_cb,
                              "menu_conv_clear", "activate", chat_window_clear_activate_cb,
                              "menu_conv_close", "activate", chat_window_close_activate_cb,
                              "menu_edit", "activate", chat_window_edit_activate_cb,
@@ -1326,9 +1336,7 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
        gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (priv->notebook), child,
                                            TRUE, TRUE, GTK_PACK_START); 
 
-       empathy_debug (DEBUG_DOMAIN, 
-                     "Chat added (%d references)",
-                     G_OBJECT (chat)->ref_count);
+       DEBUG ("Chat added (%d references)", G_OBJECT (chat)->ref_count);
 }
 
 void
@@ -1359,9 +1367,7 @@ empathy_chat_window_remove_chat (EmpathyChatWindow *window,
                                          GTK_WIDGET (chat));
        gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), position);
 
-       empathy_debug (DEBUG_DOMAIN, 
-                     "Chat removed (%d references)", 
-                     G_OBJECT (chat)->ref_count - 1);
+       DEBUG ("Chat removed (%d references)", G_OBJECT (chat)->ref_count - 1);
 
        g_object_unref (chat);
 }
@@ -1379,10 +1385,8 @@ empathy_chat_window_move_chat (EmpathyChatWindow *old_window,
 
        widget = GTK_WIDGET (chat);
 
-       empathy_debug (DEBUG_DOMAIN,
-                     "Chat moving with widget:%p (%d references)", 
-                     widget,
-                     G_OBJECT (widget)->ref_count);
+       DEBUG ("Chat moving with widget:%p (%d references)", widget,
+               G_OBJECT (widget)->ref_count);
 
        /* We reference here to make sure we don't loose the widget
         * and the EmpathyChat object during the move.