# HG changeset patch # User Sean Egan # Date 1067237690 0 # Node ID 15155dbc768aac2e26aabb80e791dae97c666e69 # Parent 565b5bca5e8a805398bba3fbb5a89b121b2ef252 [gaim-migrate @ 7937] GtkIMHtmlCopyable allows non-text items in gtkimhtml to have alternate text associated with it. Right now only smileys use it, but it can easily be extended to
s or images or whatnot. committer: Tailor Script diff -r 565b5bca5e8a -r 15155dbc768a ChangeLog --- a/ChangeLog Mon Oct 27 05:02:51 2003 +0000 +++ b/ChangeLog Mon Oct 27 06:54:50 2003 +0000 @@ -5,6 +5,7 @@ * Added an option to remove the formatting toolbar, both globally and on a per-window basis (Nathan Fredrickson) * Added a drop shadow to the buddy list tooltip + * Smileys are copyable * Fixed the ICQ login crash * Fixed a crash in the Add Chat dialog when selecting an account that doesn't support chats. Closes bug #821606. @@ -12,6 +13,7 @@ connect. * Fixed a crash when deleting an account that has IMs or chats open. Closes bug #821630. + * Smileys have background colors * If SSL is not enabled, MSN will load, but error on connect. * Disable Jabber SASL auth until the standard stabilizes * Czech translation updated (Stanislav Brabec, Miloslav Trmac) diff -r 565b5bca5e8a -r 15155dbc768a src/gtkimhtml.c --- a/src/gtkimhtml.c Mon Oct 27 05:02:51 2003 +0000 +++ b/src/gtkimhtml.c Mon Oct 27 06:54:50 2003 +0000 @@ -331,6 +331,61 @@ return FALSE; } +static GtkIMHtmlCopyable *gtk_imhtml_copyable_new(GtkIMHtml *imhtml, GtkTextMark *mark, const gchar *text) +{ + GtkIMHtmlCopyable *copy = g_malloc(sizeof(GtkIMHtmlCopyable)); + copy->mark = mark; + copy->text = g_strdup(text); + imhtml->copyables = g_slist_append(imhtml->copyables, copy); + return copy; +} + +static void copy_clipboard_cb(GtkIMHtml *imhtml, GtkClipboard *clipboard) +{ + GtkTextMark *sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer); + GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); + GtkTextIter start, end, smiley, last; + GString *str = g_string_new(NULL); + char *text; + + GSList *copyables; + + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, sel); + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &end, ins); + + if (gtk_text_iter_equal(&start, &end)) + return; + + gtk_text_iter_order(&start, &end); + last = start; + + for (copyables = imhtml->copyables; copyables != NULL; copyables = copyables->next) { + GtkIMHtmlCopyable *copy = GTK_IMHTML_COPYABLE(copyables->data); + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &smiley, copy->mark); + if (gtk_text_iter_compare(&end, &smiley) < 0) { + break; + } + if (gtk_text_iter_compare(&last, &smiley) <= 0) { + text = gtk_text_buffer_get_text(imhtml->text_buffer, &last, &smiley, FALSE); + str = g_string_append(str, text); + str = g_string_append(str, copy->text); + last = smiley; + g_free(text); + } + } + text = gtk_text_buffer_get_text(imhtml->text_buffer, &last, &end, FALSE); + str = g_string_append(str, text); + g_free(text); + + gtk_clipboard_set_text(clipboard, str->str, str->len); + g_string_free(str, TRUE); +} + +static gboolean button_release_cb(GtkIMHtml *imhtml, GdkEventButton event, gpointer the_foibles_of_man) +{ + copy_clipboard_cb(imhtml, gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_PRIMARY)); + return FALSE; +} static GtkTextViewClass *parent_class = NULL; @@ -347,7 +402,8 @@ { GtkIMHtml *imhtml = GTK_IMHTML(object); GList *scalables; - + GSList *copyables; + g_hash_table_destroy(imhtml->smiley_data); gtk_smiley_tree_destroy(imhtml->default_smilies); gdk_cursor_unref(imhtml->hand_cursor); @@ -362,7 +418,13 @@ GtkIMHtmlScalable *scale = GTK_IMHTML_SCALABLE(scalables->data); scale->free(scale); } - + + for (copyables = imhtml->copyables; copyables; copyables = copyables->next) { + GtkIMHtmlCopyable *copy = GTK_IMHTML_COPYABLE(copyables->data); + g_free(copy->text); + g_free(copy); + } + g_list_free(imhtml->scalables); G_OBJECT_CLASS(parent_class)->finalize (object); } @@ -426,6 +488,9 @@ g_signal_connect(G_OBJECT(imhtml), "motion-notify-event", G_CALLBACK(gtk_motion_event_notify), NULL); g_signal_connect(G_OBJECT(imhtml), "leave-notify-event", G_CALLBACK(gtk_leave_event_notify), NULL); g_signal_connect(G_OBJECT(imhtml), "key_press_event", G_CALLBACK(gtk_key_pressed_cb), NULL); + g_signal_connect(G_OBJECT(imhtml), "copy-clipboard", G_CALLBACK(copy_clipboard_cb), + gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD)); + g_signal_connect(G_OBJECT(imhtml), "button-release-event", G_CALLBACK(button_release_cb), imhtml); gtk_widget_add_events(GTK_WIDGET(imhtml), GDK_LEAVE_NOTIFY_MASK); imhtml->tip = NULL; @@ -433,6 +498,7 @@ imhtml->tip_window = NULL; imhtml->scalables = NULL; + imhtml->copyables = NULL; } GtkWidget *gtk_imhtml_new(void *a, void *b) @@ -1372,6 +1438,7 @@ GdkPixbufAnimation *annipixbuf = NULL; GdkPixbuf *pixbuf = NULL; GtkIMHtmlFontDetail *fd; + gchar *sml = NULL; if (fonts) { fd = fonts->data; @@ -1394,6 +1461,9 @@ if (icon) { gtk_widget_show(icon); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), icon, anchor); + gtk_imhtml_copyable_new(imhtml, + gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE), + ws); } copy = iter; diff -r 565b5bca5e8a -r 15155dbc768a src/gtkimhtml.h --- a/src/gtkimhtml.h Mon Oct 27 05:02:51 2003 +0000 +++ b/src/gtkimhtml.h Mon Oct 27 06:54:50 2003 +0000 @@ -37,6 +37,7 @@ #define GTK_IS_IMHTML(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_IMHTML)) #define GTK_IS_IMHTML_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IMHTML)) #define GTK_IMHTML_SCALABLE(obj) ((GtkIMHtmlScalable *)obj) +#define GTK_IMHTML_COPYABLE(obj) ((GtkIMHtmlCopyable *)obj) typedef struct _GtkIMHtml GtkIMHtml; typedef struct _GtkIMHtmlClass GtkIMHtmlClass; @@ -46,6 +47,7 @@ typedef struct _GtkIMHtmlScalable GtkIMHtmlScalable; typedef struct _GtkIMHtmlImage GtkIMHtmlImage; typedef struct _GtkIMHtmlHr GtkIMHtmlHr; +typedef struct _GtkIMHtmlCopyable GtkIMHtmlCopyable; struct _GtkIMHtml { GtkTextView text_view; @@ -67,6 +69,8 @@ GList *scalables; GdkRectangle old_rect; + GSList *copyables; + gchar *search_string; }; @@ -103,6 +107,11 @@ void (*free)(struct _GtkIMHtmlScalable *); }; +struct _GtkIMHtmlCopyable { + GtkTextMark *mark; + char *text; +}; + struct _GtkIMHtmlImage { GtkIMHtmlScalable scalable; GtkImage *image;