[empathy: 1/4] Fix copy clipboard to show smileys and to show name and time when using themes other than Classic



commit 3f4adb1dc22d89c35b56ea5fa99a5976cfc101bb
Author: Gabriel Millaire <millaire gabriel gmail com>
Date:   Wed Jul 1 13:17:00 2009 -0400

    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 deletions(-)
---
diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c
index d7ebda6..2e83cdf 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 900e921..0d3e4c5 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 f522427..0c989ba 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]