]> git.0d.be Git - empathy.git/blobdiff - src/empathy-chat-window.c
drag_data_received_individual_id: make sure manager is initialized
[empathy.git] / src / empathy-chat-window.c
index e987bf7daa28812af2310e69f28c15b2078fb735..587ae7d4b69cff7485138bad65abdd01a386e1e8 100644 (file)
@@ -38,6 +38,7 @@
 
 #include <telepathy-glib/telepathy-glib.h>
 
+#include <libempathy/empathy-client-factory.h>
 #include <libempathy/empathy-contact.h>
 #include <libempathy/empathy-message.h>
 #include <libempathy/empathy-chatroom-manager.h>
@@ -46,6 +47,7 @@
 #include <libempathy/empathy-tp-contact-factory.h>
 #include <libempathy/empathy-contact-list.h>
 #include <libempathy/empathy-request-util.h>
+#include <libempathy/empathy-individual-manager.h>
 
 #include <libempathy-gtk/empathy-images.h>
 #include <libempathy-gtk/empathy-contact-dialogs.h>
@@ -128,12 +130,14 @@ static const guint tab_accel_keys[] = {
 
 typedef enum {
        DND_DRAG_TYPE_CONTACT_ID,
+       DND_DRAG_TYPE_INDIVIDUAL_ID,
        DND_DRAG_TYPE_URI_LIST,
        DND_DRAG_TYPE_TAB
 } DndDragType;
 
 static const GtkTargetEntry drag_types_dest[] = {
        { "text/contact-id", 0, DND_DRAG_TYPE_CONTACT_ID },
+       { "text/x-individual-id", 0, DND_DRAG_TYPE_INDIVIDUAL_ID },
        { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, DND_DRAG_TYPE_TAB },
        { "text/uri-list", 0, DND_DRAG_TYPE_URI_LIST },
        { "text/path-list", 0, DND_DRAG_TYPE_URI_LIST },
@@ -141,6 +145,7 @@ static const GtkTargetEntry drag_types_dest[] = {
 
 static const GtkTargetEntry drag_types_dest_contact[] = {
        { "text/contact-id", 0, DND_DRAG_TYPE_CONTACT_ID },
+       { "text/x-individual-id", 0, DND_DRAG_TYPE_INDIVIDUAL_ID },
 };
 
 static const GtkTargetEntry drag_types_dest_file[] = {
@@ -211,6 +216,161 @@ chat_window_find_chat (EmpathyChat *chat)
        return NULL;
 }
 
+static void
+remove_all_chats (EmpathyChatWindow *window)
+{
+       EmpathyChatWindowPriv *priv;
+
+       priv = GET_PRIV (window);
+       g_object_ref (window);
+
+       while (priv->chats) {
+               empathy_chat_window_remove_chat (window, priv->chats->data);
+       }
+
+       g_object_unref (window);
+}
+
+static void
+confirm_close_response_cb (GtkWidget *dialog,
+                           int response,
+                           EmpathyChatWindow *window)
+{
+       EmpathyChat *chat;
+
+       chat = g_object_get_data (G_OBJECT (dialog), "chat");
+
+       gtk_widget_destroy (dialog);
+
+       if (response != GTK_RESPONSE_ACCEPT)
+               return;
+
+       if (chat != NULL) {
+               empathy_chat_window_remove_chat (window, chat);
+       } else {
+               remove_all_chats (window);
+       }
+}
+
+static void
+confirm_close (EmpathyChatWindow *window,
+               gboolean close_window,
+               guint n_rooms,
+               EmpathyChat *chat)
+{
+       EmpathyChatWindowPriv *priv;
+       GtkWidget *dialog;
+       gchar *primary, *secondary;
+
+       g_return_if_fail (n_rooms > 0);
+
+       if (n_rooms > 1) {
+               g_return_if_fail (chat == NULL);
+       } else {
+               g_return_if_fail (chat != NULL);
+       }
+
+       priv = GET_PRIV (window);
+
+       /* If there are no chats in this window, how could we possibly have got
+        * here?
+        */
+       g_return_if_fail (priv->chats != NULL);
+
+       /* Treat closing a window which only has one tab exactly like closing
+        * that tab.
+        */
+       if (close_window && priv->chats->next == NULL) {
+               close_window = FALSE;
+               chat = priv->chats->data;
+       }
+
+       if (close_window) {
+               primary = g_strdup (_("Close this window?"));
+
+               if (n_rooms == 1) {
+                       gchar *chat_name = empathy_chat_dup_name (chat);
+                       secondary = g_strdup_printf (
+                               _("Closing this window will leave %s. You will "
+                                 "not receive any further messages until you "
+                                 "rejoin it."),
+                               chat_name);
+                       g_free (chat_name);
+               } else {
+                       secondary = g_strdup_printf (
+                               /* Note to translators: the number of chats will
+                                * always be at least 2.
+                                */
+                               ngettext (
+                                       "Closing this window will leave a chat room. You will "
+                                       "not receive any further messages until you rejoin it.",
+                                       "Closing this window will leave %u chat rooms. You will "
+                                       "not receive any further messages until you rejoin them.",
+                                       n_rooms),
+                               n_rooms);
+               }
+       } else {
+               gchar *chat_name = empathy_chat_dup_name (chat);
+               primary = g_strdup_printf (_("Leave %s?"), chat_name);
+               secondary = g_strdup (_("You will not receive any further messages from this chat "
+                                       "room until you rejoin it."));
+               g_free (chat_name);
+       }
+
+       dialog = gtk_message_dialog_new (
+               GTK_WINDOW (priv->dialog),
+               GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+               GTK_MESSAGE_WARNING,
+               GTK_BUTTONS_CANCEL,
+               "%s", primary);
+
+       gtk_window_set_title (GTK_WINDOW (dialog), "");
+       g_object_set (dialog, "secondary-text", secondary, NULL);
+
+       g_free (primary);
+       g_free (secondary);
+
+       gtk_dialog_add_button (GTK_DIALOG (dialog),
+               close_window ? _("Close window") : _("Leave room"),
+               GTK_RESPONSE_ACCEPT);
+       gtk_dialog_set_default_response (GTK_DIALOG (dialog),
+               GTK_RESPONSE_ACCEPT);
+
+       if (!close_window) {
+               g_object_set_data (G_OBJECT (dialog), "chat", chat);
+       }
+
+       g_signal_connect (dialog, "response",
+               G_CALLBACK (confirm_close_response_cb), window);
+
+       gtk_window_present (GTK_WINDOW (dialog));
+}
+
+/* Returns TRUE if we should check if the user really wants to leave.  If it's
+ * a multi-user chat, and it has a TpChat (so there's an underlying channel, so
+ * the user is actually in the room as opposed to having been kicked or gone
+ * offline or something), then we should check.
+ */
+static gboolean
+chat_needs_close_confirmation (EmpathyChat *chat)
+{
+       return (empathy_chat_is_room (chat)
+               && empathy_chat_get_tp_chat (chat) != NULL);
+}
+
+static void
+maybe_close_chat (EmpathyChatWindow *window,
+                  EmpathyChat *chat)
+{
+       g_return_if_fail (chat != NULL);
+
+       if (chat_needs_close_confirmation (chat)) {
+               confirm_close (window, FALSE, 1, chat);
+       } else {
+               empathy_chat_window_remove_chat (window, chat);
+       }
+}
+
 static void
 chat_window_close_clicked_cb (GtkAction   *action,
                              EmpathyChat *chat)
@@ -218,7 +378,7 @@ chat_window_close_clicked_cb (GtkAction   *action,
        EmpathyChatWindow *window;
 
        window = chat_window_find_chat (chat);
-       empathy_chat_window_remove_chat (window, chat);
+       maybe_close_chat (window, chat);
 }
 
 static void
@@ -268,7 +428,7 @@ chat_window_create_label (EmpathyChatWindow *window,
        PangoAttribute       *attr;
 
        /* The spacing between the button and the label. */
-       hbox = gtk_hbox_new (FALSE, 0);
+       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
        event_box = gtk_event_box_new ();
        gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE);
@@ -294,7 +454,7 @@ chat_window_create_label (EmpathyChatWindow *window,
        status_image = gtk_image_new ();
 
        /* Spacing between the icon and label. */
-       event_box_hbox = gtk_hbox_new (FALSE, 0);
+       event_box_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
        gtk_box_pack_start (GTK_BOX (event_box_hbox), status_image, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (event_box_hbox), name_label, TRUE, TRUE, 0);
@@ -403,7 +563,7 @@ chat_window_conversation_menu_update (EmpathyChatWindowPriv *priv,
        tp_chat = empathy_chat_get_tp_chat (priv->current_chat);
 
        if (tp_chat != NULL) {
-               connection = empathy_tp_chat_get_connection (tp_chat);
+               connection = tp_channel_borrow_connection (TP_CHANNEL (tp_chat));
 
                sensitive = empathy_tp_chat_can_add_contact (tp_chat) &&
                        (tp_connection_get_status (connection, NULL) ==
@@ -764,6 +924,19 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
                append_markup_printf (tooltip, "\n%s", _("Typing a message."));
        }
 
+       if (remote_contact != NULL) {
+               const gchar * const *types;
+
+               types = empathy_contact_get_client_types (remote_contact);
+               if (types != NULL && !tp_strdiff (types[0], "phone")) {
+                       /* I'm on a phone ! */
+                       gchar *tmp = name;
+
+                       name = g_strdup_printf ("☎ %s", name);
+                       g_free (tmp);
+               }
+       }
+
        markup = g_string_free (tooltip, FALSE);
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget");
        gtk_widget_set_tooltip_markup (widget, markup);
@@ -772,10 +945,19 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        g_free (markup);
 
        /* Update tab and menu label */
+       if (empathy_chat_is_highlighted (chat)) {
+               markup = g_markup_printf_escaped (
+                       "<span color=\"red\" weight=\"bold\">%s</span>",
+                       name);
+       } else {
+               markup = g_markup_escape_text (name, -1);
+       }
+
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label");
-       gtk_label_set_text (GTK_LABEL (widget), name);
+       gtk_label_set_markup (GTK_LABEL (widget), markup);
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-label");
-       gtk_label_set_text (GTK_LABEL (widget), name);
+       gtk_label_set_markup (GTK_LABEL (widget), markup);
+       g_free (markup);
 
        /* Update the window if it's the current chat */
        if (priv->current_chat == chat) {
@@ -975,24 +1157,6 @@ chat_window_contacts_toggled_cb (GtkToggleAction   *toggle_action,
        empathy_chat_set_show_contacts (priv->current_chat, active);
 }
 
-static void
-got_contact_cb (TpConnection            *connection,
-                EmpathyContact          *contact,
-                const GError            *error,
-                gpointer                 user_data,
-                GObject                 *object)
-{
-       EmpathyTpChat *tp_chat = EMPATHY_TP_CHAT (user_data);
-
-       if (error != NULL) {
-               DEBUG ("Failed: %s", error->message);
-               return;
-       } else {
-               empathy_contact_list_add (EMPATHY_CONTACT_LIST (tp_chat),
-                               contact, _("Inviting you to this room"));
-       }
-}
-
 static void
 chat_window_invite_participant_activate_cb (GtkAction         *action,
                                            EmpathyChatWindow *window)
@@ -1000,35 +1164,34 @@ chat_window_invite_participant_activate_cb (GtkAction         *action,
        EmpathyChatWindowPriv *priv;
        GtkWidget             *dialog;
        EmpathyTpChat         *tp_chat;
-       TpChannel             *channel;
        int                    response;
-       TpAccount             *account;
 
        priv = GET_PRIV (window);
 
        g_return_if_fail (priv->current_chat != NULL);
 
        tp_chat = empathy_chat_get_tp_chat (priv->current_chat);
-       channel = empathy_tp_chat_get_channel (tp_chat);
-       account = empathy_chat_get_account (priv->current_chat);
 
        dialog = empathy_invite_participant_dialog_new (
-                       GTK_WINDOW (priv->dialog), account);
+                       GTK_WINDOW (priv->dialog), tp_chat);
        gtk_widget_show (dialog);
 
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
        if (response == GTK_RESPONSE_ACCEPT) {
-               TpConnection *connection;
-               const char *id;
+               TpContact *tp_contact;
+               EmpathyContact *contact;
+
+               tp_contact = empathy_invite_participant_dialog_get_selected (
+                       EMPATHY_INVITE_PARTICIPANT_DIALOG (dialog));
+               if (tp_contact == NULL) goto out;
 
-               id = empathy_contact_selector_dialog_get_selected (
-                               EMPATHY_CONTACT_SELECTOR_DIALOG (dialog), NULL, NULL);
-               if (EMP_STR_EMPTY (id)) goto out;
+               contact = empathy_contact_dup_from_tp_contact (tp_contact);
+
+               empathy_contact_list_add (EMPATHY_CONTACT_LIST (tp_chat),
+                               contact, _("Inviting you to this room"));
 
-               connection = tp_channel_borrow_connection (channel);
-               empathy_tp_contact_factory_get_from_id (connection, id,
-                       got_contact_cb, tp_chat,  NULL, NULL);
+               g_object_unref (contact);
        }
 
 out:
@@ -1045,7 +1208,7 @@ chat_window_close_activate_cb (GtkAction         *action,
 
        g_return_if_fail (priv->current_chat != NULL);
 
-       empathy_chat_window_remove_chat (window, priv->current_chat);
+       maybe_close_chat (window, priv->current_chat);
 }
 
 static void
@@ -1289,14 +1452,25 @@ chat_window_delete_event_cb (GtkWidget        *dialog,
                             EmpathyChatWindow *window)
 {
        EmpathyChatWindowPriv *priv = GET_PRIV (window);
+       EmpathyChat *chat = NULL;
+       guint n_rooms = 0;
+       GList *l;
 
        DEBUG ("Delete event received");
 
-       g_object_ref (window);
-       while (priv->chats) {
-               empathy_chat_window_remove_chat (window, priv->chats->data);
+       for (l = priv->chats; l != NULL; l = l->next) {
+               if (chat_needs_close_confirmation (l->data)) {
+                       chat = l->data;
+                       n_rooms++;
+               }
+       }
+
+       if (n_rooms > 0) {
+               confirm_close (window, TRUE, n_rooms,
+                       (n_rooms == 1 ? chat : NULL));
+       } else {
+               remove_all_chats (window);
        }
-       g_object_unref (window);
 
        return TRUE;
 }
@@ -1393,6 +1567,10 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
                        notify_notification_set_hint_string (notification,
                                EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "1");
                }
+
+               notify_notification_set_hint (notification,
+                       EMPATHY_NOTIFY_MANAGER_CAP_CATEGORY,
+                       g_variant_new_string ("im.received"));
        }
 
        pixbuf = empathy_notify_manager_get_pixbuf_for_notification (priv->notify_mgr,
@@ -1408,30 +1586,6 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
        g_free (escaped);
 }
 
-static void
-chat_window_set_highlight_room_labels (EmpathyChat *chat)
-{
-       gchar *markup, *name;
-       GtkWidget *widget;
-
-       if (!empathy_chat_is_room (chat))
-               return;
-
-       name = empathy_chat_dup_name (chat);
-       markup = g_markup_printf_escaped (
-               "<span color=\"red\" weight=\"bold\">%s</span>",
-               name);
-
-       widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label");
-       gtk_label_set_markup (GTK_LABEL (widget), markup);
-
-       widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-label");
-       gtk_label_set_markup (GTK_LABEL (widget), markup);
-
-       g_free (name);
-       g_free (markup);
-}
-
 static gboolean
 empathy_chat_window_has_focus (EmpathyChatWindow *window)
 {
@@ -1451,6 +1605,7 @@ static void
 chat_window_new_message_cb (EmpathyChat       *chat,
                            EmpathyMessage    *message,
                            gboolean pending,
+                           gboolean should_highlight,
                            EmpathyChatWindow *window)
 {
        EmpathyChatWindowPriv *priv;
@@ -1496,8 +1651,7 @@ chat_window_new_message_cb (EmpathyChat       *chat,
         *   a) the chatroom's always_urgent property is TRUE
         *   b) the message contains our alias
         */
-       if (empathy_chat_is_room (chat) ||
-           empathy_chat_get_remote_contact (chat) == NULL) {
+       if (empathy_chat_is_room (chat)) {
                TpAccount             *account;
                const gchar           *room;
                EmpathyChatroom       *chatroom;
@@ -1511,15 +1665,13 @@ chat_window_new_message_cb (EmpathyChat       *chat,
                if (chatroom != NULL && empathy_chatroom_is_always_urgent (chatroom)) {
                        needs_urgency = TRUE;
                } else {
-                       needs_urgency = empathy_message_should_highlight (message);
+                       needs_urgency = should_highlight;
                }
        } else {
                needs_urgency = TRUE;
        }
 
        if (needs_urgency) {
-               chat_window_set_highlight_room_labels (chat);
-
                if (!has_focus) {
                        chat_window_set_urgency_hint (window, TRUE);
                }
@@ -1832,6 +1984,70 @@ chat_window_drag_motion (GtkWidget        *widget,
        return FALSE;
 }
 
+static void
+drag_data_received_individual_id (EmpathyChatWindow *self,
+                                 GtkWidget *widget,
+                                 GdkDragContext *context,
+                                 int x,
+                                 int y,
+                                 GtkSelectionData *selection,
+                                 guint info,
+                                 guint time_)
+{
+       const gchar *id;
+       EmpathyIndividualManager *manager = NULL;
+       FolksIndividual *individual;
+       EmpathyChatWindowPriv *priv = GET_PRIV (self);
+       EmpathyTpChat *chat;
+       TpContact *tp_contact;
+       TpConnection *conn;
+       EmpathyContact *contact;
+
+       id = (const gchar *) gtk_selection_data_get_data (selection);
+
+       DEBUG ("DND invididual %s", id);
+
+       if (priv->current_chat == NULL)
+               goto out;
+
+       chat = empathy_chat_get_tp_chat (priv->current_chat);
+       if (chat == NULL)
+               goto out;
+
+       if (!empathy_tp_chat_can_add_contact (chat)) {
+               DEBUG ("Can't invite contact to %s",
+                               tp_proxy_get_object_path (chat));
+               goto out;
+       }
+
+       manager = empathy_individual_manager_dup_singleton ();
+
+       individual = empathy_individual_manager_lookup_member (manager, id);
+       if (individual == NULL) {
+               DEBUG ("Failed to find individual %s", id);
+               goto out;
+       }
+
+       conn = tp_channel_borrow_connection ((TpChannel *) chat);
+       tp_contact = empathy_get_tp_contact_for_individual (individual, conn);
+       if (tp_contact == NULL) {
+               DEBUG ("Can't find a TpContact on connection %s for %s",
+                               tp_proxy_get_object_path (conn), id);
+               goto out;
+       }
+
+       DEBUG ("Inviting %s to join %s", tp_contact_get_identifier (tp_contact),
+                       tp_channel_get_identifier ((TpChannel *) chat));
+
+       contact = empathy_contact_dup_from_tp_contact (tp_contact);
+       empathy_contact_list_add (EMPATHY_CONTACT_LIST (chat), contact, NULL);
+       g_object_unref (contact);
+
+out:
+       gtk_drag_finish (context, TRUE, FALSE, time_);
+       tp_clear_object (&manager);
+}
+
 static void
 chat_window_drag_data_received (GtkWidget        *widget,
                                GdkDragContext   *context,
@@ -1846,7 +2062,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
                EmpathyChat           *chat = NULL;
                EmpathyChatWindow     *old_window;
                TpAccount             *account = NULL;
-               TpAccountManager      *account_manager;
+               EmpathyClientFactory  *factory;
                const gchar           *id;
                gchar                **strv;
                const gchar           *account_id;
@@ -1854,9 +2070,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
 
                id = (const gchar*) gtk_selection_data_get_data (selection);
 
-               /* FIXME: Perhaps should be sure that the account manager is
-                * prepared before calling _ensure_account on it. */
-               account_manager = tp_account_manager_dup ();
+               factory = empathy_client_factory_dup ();
 
                DEBUG ("DND contact from roster with id:'%s'", id);
 
@@ -1865,7 +2079,11 @@ chat_window_drag_data_received (GtkWidget        *widget,
                        account_id = strv[0];
                        contact_id = strv[1];
                        account =
-                               tp_account_manager_ensure_account (account_manager, account_id);
+                               tp_simple_client_factory_ensure_account (
+                               TP_SIMPLE_CLIENT_FACTORY (factory), account_id,
+                                NULL, NULL);
+
+                       g_object_unref (factory);
                        if (account != NULL)
                                chat = empathy_chat_window_find_chat (account, contact_id, FALSE);
                }
@@ -1878,12 +2096,13 @@ chat_window_drag_data_received (GtkWidget        *widget,
 
                if (!chat) {
                        empathy_chat_with_contact_id (
-                               account, contact_id, empathy_get_current_action_time ());
+                               account, contact_id,
+                               empathy_get_current_action_time (),
+                               NULL, NULL);
 
                        g_strfreev (strv);
                        return;
                }
-               g_object_unref (account_manager);
                g_strfreev (strv);
 
                old_window = chat_window_find_chat (chat);
@@ -1909,6 +2128,10 @@ chat_window_drag_data_received (GtkWidget        *widget,
                 */
                gtk_drag_finish (context, TRUE, FALSE, time_);
        }
+       else if (info == DND_DRAG_TYPE_INDIVIDUAL_ID) {
+               drag_data_received_individual_id (window, widget, context, x, y,
+                               selection, info, time_);
+       }
        else if (info == DND_DRAG_TYPE_URI_LIST) {
                EmpathyChatWindowPriv *priv;
                EmpathyContact *contact;
@@ -2200,18 +2423,6 @@ empathy_chat_window_init (EmpathyChatWindow *window)
                                                   window);
 }
 
-static GtkWidget *
-empathy_chat_window_get_dialog (EmpathyChatWindow *window)
-{
-       EmpathyChatWindowPriv *priv;
-
-       g_return_val_if_fail (window != NULL, NULL);
-
-       priv = GET_PRIV (window);
-
-       return priv->dialog;
-}
-
 /* Returns the window to open a new tab in if there is a suitable window,
  * otherwise, returns NULL indicating that a new window should be added.
  */
@@ -2234,13 +2445,10 @@ empathy_chat_window_get_default (gboolean room)
 
        for (l = chat_windows; l; l = l->next) {
                EmpathyChatWindow *chat_window;
-               GtkWidget         *dialog;
                guint nb_rooms, nb_private;
 
                chat_window = l->data;
 
-               dialog = empathy_chat_window_get_dialog (chat_window);
-
                empathy_chat_window_get_nb_chats (chat_window, &nb_rooms, &nb_private);
 
                /* Skip the window if there aren't any rooms in it */
@@ -2251,9 +2459,6 @@ empathy_chat_window_get_default (gboolean room)
                if (!room && nb_private == 0)
                        continue;
 
-               /* Found a window on this desktop, make it visible if necessary */
-               if (!empathy_window_get_is_visible (GTK_WINDOW (dialog)))
-                       empathy_window_present (GTK_WINDOW (dialog));
                return chat_window;
        }
 
@@ -2518,8 +2723,12 @@ empathy_chat_window_present_chat (EmpathyChat *chat,
        }
 
        empathy_chat_window_switch_to_chat (window, chat);
-       empathy_window_present_with_time (GTK_WINDOW (priv->dialog),
-         x_timestamp);
+
+       /* Don't use empathy_window_present_with_time () which would move the window
+        * to our current desktop but move to the window's desktop instead. This is
+        * more coherent with Shell's 'app is ready' notication which moves the view
+        * to the app desktop rather than moving the app itself. */
+       empathy_move_to_window_desktop (GTK_WINDOW (priv->dialog), x_timestamp);
 
        gtk_widget_grab_focus (chat->input_text_view);
 }