From 3f4adb1dc22d89c35b56ea5fa99a5976cfc101bb Mon Sep 17 00:00:00 2001 From: Gabriel Millaire Date: Wed, 1 Jul 2009 13:17:00 -0400 Subject: Fix copy clipboard to show smileys and to show name and time when using themes other than Classic Adds an association string to hbox for name and time in themes, adds an association string to pixbuf smiley --- libempathy-gtk/empathy-chat-text-view.c | 47 ++++++++++++++++++++++++++++++++- libempathy-gtk/empathy-smiley-manager.c | 2 ++ libempathy-gtk/empathy-theme-boxes.c | 11 ++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c index d7ebda647..2e83cdfb8 100644 --- a/libempathy-gtk/empathy-chat-text-view.c +++ b/libempathy-gtk/empathy-chat-text-view.c @@ -1159,14 +1159,59 @@ static void chat_text_view_copy_clipboard (EmpathyChatView *view) { GtkTextBuffer *buffer; + GtkTextIter start, iter, end; GtkClipboard *clipboard; + GdkPixbuf *pixbuf; + gunichar c; + GtkTextChildAnchor *anchor = NULL; + GString *str; + GList *list; + gboolean flag_return = FALSE; + + str = g_string_new (""); g_return_if_fail (EMPATHY_IS_CHAT_TEXT_VIEW (view)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - gtk_text_buffer_copy_clipboard (buffer, clipboard); + if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) { + iter = start; + while ((c = gtk_text_iter_get_char (&iter)) != 0 && + !gtk_text_iter_equal (&iter, &end)) { + if (c == 0xFFFC) { + flag_return = FALSE; + if ((pixbuf = gtk_text_iter_get_pixbuf (&iter))) { + gchar *text; + text = g_object_get_data (G_OBJECT(pixbuf), + "smiley_str"); + if (text) + str = g_string_append (str, text); + } else if ((anchor = gtk_text_iter_get_child_anchor (&iter))) { + gchar *text; + list = gtk_text_child_anchor_get_widgets (anchor); + if (list) { + text = g_object_get_data (G_OBJECT(list->data), + "str_obj"); + if (text) + str = g_string_append (str, text); + } + g_list_free (list); + } + } else if (c == '\n') { + if (!flag_return) { + flag_return = TRUE; + str = g_string_append_unichar (str, c); + } + } else { + flag_return = FALSE; + str = g_string_append_unichar (str, c); + } + gtk_text_iter_forward_char (&iter); + } + } + + gtk_clipboard_set_text (clipboard, g_string_free (str, FALSE), -1); } static void diff --git a/libempathy-gtk/empathy-smiley-manager.c b/libempathy-gtk/empathy-smiley-manager.c index 900e9211c..0d3e4c512 100644 --- a/libempathy-gtk/empathy-smiley-manager.c +++ b/libempathy-gtk/empathy-smiley-manager.c @@ -245,6 +245,8 @@ smiley_manager_add_valist (EmpathySmileyManager *manager, } /* We give the ownership of path to the smiley */ + g_object_set_data_full (G_OBJECT (pixbuf), "smiley_str", + g_strdup (first_str), g_free); smiley = smiley_new (pixbuf, g_strdup (first_str), path); priv->smileys = g_slist_prepend (priv->smileys, smiley); } diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c index f5224278c..0c989ba11 100644 --- a/libempathy-gtk/empathy-theme-boxes.c +++ b/libempathy-gtk/empathy-theme-boxes.c @@ -199,6 +199,7 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, gboolean color_set; GtkTextTagTable *table; GtkTextTag *tag; + GString *str_obj; contact = empathy_message_get_sender (msg); name = empathy_contact_get_name (contact); @@ -267,6 +268,12 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, "use-markup", TRUE, "xalign", 1.0, NULL); + + str_obj = g_string_new ("\n- "); + str_obj = g_string_append (str_obj, name); + str_obj = g_string_append (str_obj, ", "); + str_obj = g_string_append (str_obj, tmp); + str_obj = g_string_append (str_obj, " -"); g_free (tmp); g_free (str); @@ -290,6 +297,10 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, gtk_box_pack_start (GTK_BOX (box), label2, TRUE, TRUE, 0); /* Add the header box to the text view */ + g_object_set_data_full (G_OBJECT (box), + "str_obj", + g_string_free (str_obj, FALSE), + g_free); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (view), box, anchor); -- cgit v1.2.3