diff options
Diffstat (limited to 'libempathy-gtk/empathy-chat.c')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 164 |
1 files changed, 137 insertions, 27 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index cf01632b4..b1d469f3f 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -52,10 +52,10 @@ #include "empathy-contact-list-store.h" #include "empathy-contact-list-view.h" #include "empathy-contact-menu.h" -#include "empathy-gtk-marshal.h" #include "empathy-input-text-view.h" #include "empathy-search-bar.h" #include "empathy-theme-manager.h" +#include "empathy-theme-adium.h" #include "empathy-smiley-manager.h" #include "empathy-ui-utils.h" #include "empathy-string-parser.h" @@ -106,6 +106,8 @@ struct _EmpathyChatPriv { guint update_misspelled_words_id; /* Source func ID for save_paned_pos_timeout () */ guint save_paned_pos_id; + /* Source func ID for chat_contacts_visible_timeout_cb () */ + guint contacts_visible_id; GtkWidget *widget; GtkWidget *hpaned; @@ -1014,6 +1016,44 @@ chat_command_whois (EmpathyChat *chat, whois_got_contact_cb, NULL, NULL, G_OBJECT (chat)); } +static void +chat_command_whale (EmpathyChat *chat, + GStrv strv) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + TpMessage *message; + + message = tp_client_message_new_text (TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + "\n\n\n" + "•_______________•"); + empathy_tp_chat_send (priv->tp_chat, message); + g_object_unref (message); +} + +static void +chat_command_babywhale (EmpathyChat *chat, + GStrv strv) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + TpMessage *message; + + message = tp_client_message_new_text (TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + "\n" + "•_____•"); + empathy_tp_chat_send (priv->tp_chat, message); + g_object_unref (message); +} + +static void +chat_command_inspector (EmpathyChat *chat, + GStrv strv) +{ + if (EMPATHY_IS_THEME_ADIUM (chat->view)) { + empathy_theme_adium_show_inspector ( + EMPATHY_THEME_ADIUM (chat->view)); + } +} + static void chat_command_help (EmpathyChat *chat, GStrv strv); typedef void (*ChatCommandFunc) (EmpathyChat *chat, GStrv strv); @@ -1068,6 +1108,11 @@ static ChatCommandItem commands[] = { {"help", 1, 2, chat_command_help, NULL, N_("/help [<command>]: show all supported commands. " "If <command> is defined, show its usage.")}, + + {"inspector", 1, 1, chat_command_inspector, NULL, NULL}, + + {"whale", 1, 1, chat_command_whale, NULL, NULL}, + {"babywhale", 1, 1, chat_command_babywhale, NULL, NULL}, }; static void @@ -1076,6 +1121,10 @@ chat_command_show_help (EmpathyChat *chat, { gchar *str; + if (item->help == NULL) { + return; + } + str = g_strdup_printf (_("Usage: %s"), _(item->help)); empathy_chat_view_append_event (chat->view, str); g_free (str); @@ -1096,8 +1145,11 @@ chat_command_help (EmpathyChat *chat, continue; } } - empathy_chat_view_append_event (chat->view, - _(commands[i].help)); + if (commands[i].help == NULL) { + continue; + } + empathy_chat_view_append_event (chat->view, + _(commands[i].help)); } return; } @@ -1109,6 +1161,9 @@ chat_command_help (EmpathyChat *chat, break; } } + if (commands[i].help == NULL) { + break; + } chat_command_show_help (chat, &commands[i]); return; } @@ -1399,6 +1454,51 @@ chat_message_acknowledged_cb (EmpathyTpChat *tp_chat, } static void +append_balance_error (EmpathyChat *chat, + const gchar *message_body) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + TpConnection *conn = tp_channel_borrow_connection (TP_CHANNEL (priv->tp_chat)); + const gchar *uri = tp_connection_get_balance_uri (conn); + const gchar *error = _("insufficient balance to send message"); + gchar *str, *str_markup = NULL; + + if (message_body != NULL) { + str = g_strdup_printf (_("Error sending message '%s': %s"), message_body, error); + } else { + str = g_strdup_printf (_("Error sending message: %s"), error); + } + + if (!tp_str_empty (uri)) { + /* translators: error used when user doesn't have enough credit on his + * account to send the message. */ + gchar *markup_error = g_strdup_printf (_("insufficient balance to send message." + " <a href='%s'>Top up</a>."), uri); + + if (message_body != NULL) { + gchar *escaped_body = g_markup_escape_text (message_body, -1); + + str_markup = g_strdup_printf (_("Error sending message '%s': %s"), + escaped_body, markup_error); + + g_free (escaped_body); + } else { + str_markup = g_strdup_printf (_("Error sending message: %s"), markup_error); + } + + g_free (markup_error); + } + + if (str_markup != NULL) + empathy_chat_view_append_event_markup (chat->view, str_markup, str); + else + empathy_chat_view_append_event (chat->view, str); + + g_free (str); + g_free (str_markup); +} + +static void chat_send_error_cb (EmpathyTpChat *tp_chat, const gchar *message_body, TpChannelTextSendError error_code, @@ -1409,9 +1509,8 @@ chat_send_error_cb (EmpathyTpChat *tp_chat, gchar *str; if (!tp_strdiff (dbus_error, TP_ERROR_STR_INSUFFICIENT_BALANCE)) { - /* translators: error used when user doesn't have enough credit on his - * account to send the message. */ - error = _("insufficient balance to send message"); + append_balance_error (chat, message_body); + return; } else if (!tp_strdiff (dbus_error, TP_ERROR_STR_NOT_CAPABLE)) { error = _("not capable"); } @@ -2597,9 +2696,22 @@ chat_member_renamed_cb (EmpathyTpChat *tp_chat, } static gboolean -chat_reset_size_request (gpointer widget) +chat_contacts_visible_timeout_cb (gpointer chat) { - gtk_widget_set_size_request (widget, -1, -1); + EmpathyChatPriv *priv = GET_PRIV (chat); + + /* Relax the size request */ + gtk_widget_set_size_request (priv->vbox_left, -1, -1); + + /* Set the position of the slider. This must be done here because + * GtkPaned need to know its size allocation and it will be settled only + * after the gtk_window_resize () tough effect. */ + if (priv->contacts_width > 0) { + gtk_paned_set_position (GTK_PANED (priv->hpaned), + priv->contacts_width); + } + + priv->contacts_visible_id = 0; return FALSE; } @@ -2609,7 +2721,6 @@ chat_update_contacts_visibility (EmpathyChat *chat, gboolean show) { EmpathyChatPriv *priv = GET_PRIV (chat); - GtkAllocation allocation; if (!priv->scrolled_window_contacts) { return; @@ -2622,6 +2733,7 @@ chat_update_contacts_visibility (EmpathyChat *chat, if (show && priv->contact_list_view == NULL) { EmpathyContactListStore *store; gint min_width; + GtkAllocation allocation; /* We are adding the contact list to the chat, we don't want the * chat view to become too small. If the chat view is already @@ -2632,12 +2744,13 @@ chat_update_contacts_visibility (EmpathyChat *chat, gtk_widget_get_allocation (priv->vbox_left, &allocation); min_width = MIN (allocation.width, 250); gtk_widget_set_size_request (priv->vbox_left, min_width, -1); - g_idle_add (chat_reset_size_request, priv->vbox_left); - if (priv->contacts_width > 0) { - gtk_paned_set_position (GTK_PANED (priv->hpaned), - priv->contacts_width); - } + /* There is no way to know when the window resize will happen + * since it is WM's decision. Let's hope it won't be longer. */ + if (priv->contacts_visible_id != 0) + g_source_remove (priv->contacts_visible_id); + priv->contacts_visible_id = g_timeout_add (500, + chat_contacts_visible_timeout_cb, chat); store = empathy_contact_list_store_new ( EMPATHY_CONTACT_LIST (priv->tp_chat)); @@ -2879,7 +2992,6 @@ chat_create_ui (EmpathyChat *chat) GList *list = NULL; gchar *filename; GtkTextBuffer *buffer; - gint paned_pos; EmpathyThemeManager *theme_mgr; filename = empathy_file_lookup ("empathy-chat.ui", @@ -2965,12 +3077,6 @@ chat_create_ui (EmpathyChat *chat) G_CALLBACK (chat_hpaned_pos_changed_cb), chat); - /* Load the paned position */ - paned_pos = g_settings_get_int (priv->gsettings_ui, - EMPATHY_PREFS_UI_CHAT_WINDOW_PANED_POS); - if (paned_pos != 0) - gtk_paned_set_position (GTK_PANED(priv->hpaned), paned_pos); - /* Set widget focus order */ list = g_list_append (NULL, priv->search_bar); list = g_list_append (list, priv->scrolled_window_input); @@ -3009,6 +3115,9 @@ chat_finalize (GObject *object) if (priv->save_paned_pos_id != 0) g_source_remove (priv->save_paned_pos_id); + if (priv->contacts_visible_id != 0) + g_source_remove (priv->contacts_visible_id); + g_object_unref (priv->gsettings_chat); g_object_unref (priv->gsettings_ui); @@ -3177,7 +3286,7 @@ empathy_chat_class_init (EmpathyChatClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, + g_cclosure_marshal_generic, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); @@ -3187,7 +3296,7 @@ empathy_chat_class_init (EmpathyChatClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - _empathy_gtk_marshal_VOID__OBJECT_BOOLEAN, + g_cclosure_marshal_generic, G_TYPE_NONE, 2, EMPATHY_TYPE_MESSAGE, G_TYPE_BOOLEAN); @@ -3197,7 +3306,7 @@ empathy_chat_class_init (EmpathyChatClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, + g_cclosure_marshal_generic, G_TYPE_NONE, 1, G_TYPE_STRV); @@ -3224,7 +3333,7 @@ account_manager_prepared_cb (GObject *source_object, EmpathyChat *chat = user_data; GError *error = NULL; - if (!tp_account_manager_prepare_finish (account_manager, result, &error)) { + if (!tp_proxy_prepare_finish (account_manager, result, &error)) { DEBUG ("Failed to prepare the account manager: %s", error->message); g_error_free (error); return; @@ -3253,12 +3362,13 @@ empathy_chat_init (EmpathyChat *chat) priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); priv->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA); - priv->contacts_width = -1; + priv->contacts_width = g_settings_get_int (priv->gsettings_ui, + EMPATHY_PREFS_UI_CHAT_WINDOW_PANED_POS); priv->input_history = NULL; priv->input_history_current = NULL; priv->account_manager = tp_account_manager_dup (); - tp_account_manager_prepare_async (priv->account_manager, NULL, + tp_proxy_prepare_async (priv->account_manager, NULL, account_manager_prepared_cb, chat); priv->show_contacts = g_settings_get_boolean (priv->gsettings_chat, |