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 From d7cd12a662172eca0276c8bbe13fc1257e0d0609 Mon Sep 17 00:00:00 2001 From: Gabriel Millaire Date: Tue, 29 Sep 2009 17:57:53 -0400 Subject: Fix after review - Early return if no selection - Now uses a for-loop with gtk_text_iter_equal - Renamed flag_return to ignore_newlines, same meaning - Improvement to string_append --- libempathy-gtk/empathy-chat-text-view.c | 59 ++++++++++++++++----------------- libempathy-gtk/empathy-theme-boxes.c | 8 ++--- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c index 2e83cdfb8..9df2e35d9 100644 --- a/libempathy-gtk/empathy-chat-text-view.c +++ b/libempathy-gtk/empathy-chat-text-view.c @@ -1166,7 +1166,7 @@ chat_text_view_copy_clipboard (EmpathyChatView *view) GtkTextChildAnchor *anchor = NULL; GString *str; GList *list; - gboolean flag_return = FALSE; + gboolean ignore_newlines = FALSE; str = g_string_new (""); @@ -1175,43 +1175,42 @@ chat_text_view_copy_clipboard (EmpathyChatView *view) buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); clipboard = gtk_clipboard_get (GDK_SELECTION_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 (!gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) + return; + + for (iter = start; !gtk_text_iter_equal (&iter, &end); gtk_text_iter_forward_char (&iter)) { + c = gtk_text_iter_get_char (&iter); + if (c == 0xFFFC) { + ignore_newlines = 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); - } 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; + g_list_free (list); + } + } else if (c == '\n') { + if (!ignore_newlines) { + ignore_newlines = TRUE; str = g_string_append_unichar (str, c); } - gtk_text_iter_forward_char (&iter); + } else { + ignore_newlines = FALSE; + str = g_string_append_unichar (str, c); } } - gtk_clipboard_set_text (clipboard, g_string_free (str, FALSE), -1); + gtk_clipboard_set_text (clipboard, g_string_free (str, FALSE), str->len); } static void diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c index 0c989ba11..3d8b8ae7d 100644 --- a/libempathy-gtk/empathy-theme-boxes.c +++ b/libempathy-gtk/empathy-theme-boxes.c @@ -270,10 +270,10 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, 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_string_append (str_obj, name); + g_string_append (str_obj, ", "); + g_string_append (str_obj, tmp); + g_string_append (str_obj, " -"); g_free (tmp); g_free (str); -- cgit v1.2.3 From 0e914b5142f3ca7c6f283edbbfda986dd570deaa Mon Sep 17 00:00:00 2001 From: Gabriel Millaire Date: Wed, 30 Sep 2009 14:17:05 -0400 Subject: Fixed a leak of str --- libempathy-gtk/empathy-chat-text-view.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c index 9df2e35d9..5b0a35680 100644 --- a/libempathy-gtk/empathy-chat-text-view.c +++ b/libempathy-gtk/empathy-chat-text-view.c @@ -1168,8 +1168,6 @@ chat_text_view_copy_clipboard (EmpathyChatView *view) GList *list; gboolean ignore_newlines = 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)); @@ -1178,6 +1176,8 @@ chat_text_view_copy_clipboard (EmpathyChatView *view) if (!gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) return; + str = g_string_new (""); + for (iter = start; !gtk_text_iter_equal (&iter, &end); gtk_text_iter_forward_char (&iter)) { c = gtk_text_iter_get_char (&iter); if (c == 0xFFFC) { -- cgit v1.2.3