# HG changeset patch # User Sean Egan # Date 1070425062 0 # Node ID 3d9d3d21e600229959d208018ba56655fc404889 # Parent 1adc71ed6d451aab020f6bba74ddf1e76dc63d4b [gaim-migrate @ 8359] I rock so hard! This is just too easy. WYSIWYG foreground and background colors. The observant commit watcher will note that I'm not really paying too close attention to the toolbar UI yet. And as a result, it doesn't really work too great. The plan is to make the toolbar its own GtkWidget, which will attach to a GtkIMHtml. The GtkIMHtml will emit signals to it, telling it what state it should be in, and the toolbar will manipulate the GtkIMHtml accordingly. This way, anything that has text entry can have a toolbar with which to edit it. committer: Tailor Script diff -r 1adc71ed6d45 -r 3d9d3d21e600 src/dialogs.c --- a/src/dialogs.c Wed Dec 03 02:03:44 2003 +0000 +++ b/src/dialogs.c Wed Dec 03 04:17:42 2003 +0000 @@ -1093,16 +1093,12 @@ gtkconv = GAIM_GTK_CONVERSATION(c); gtkconv->fg_color = text_color; - g_snprintf(open_tag, 23, "", + g_snprintf(open_tag, 23, "#%02X%02X%02X", text_color.red / 256, text_color.green / 256, text_color.blue / 256); - gaim_gtk_surround(gtkconv, open_tag, ""); + gtk_imhtml_toggle_forecolor(GTK_IMHTML(gtkconv->entry), open_tag); - gaim_debug(GAIM_DEBUG_MISC, "fgcolor dialog", "#%02X%02X%02X\n", - text_color.red / 256, - text_color.green / 256, - text_color.blue / 256); g_free(open_tag); cancel_fgcolor(NULL, c); } @@ -1124,16 +1120,12 @@ gtkconv = GAIM_GTK_CONVERSATION(c); gtkconv->bg_color = text_color; - g_snprintf(open_tag, 25, "", + g_snprintf(open_tag, 25, "#%02X%02X%02X", text_color.red / 256, text_color.green / 256, text_color.blue / 256); - gaim_gtk_surround(gtkconv, open_tag, ""); - gaim_debug(GAIM_DEBUG_MISC, "bgcolor dialog", "#%02X%02X%02X\n", - text_color.red / 256, - text_color.green / 256, - text_color.blue / 256); - + gtk_imhtml_toggle_backcolor(GTK_IMHTML(gtkconv->entry), open_tag); + g_free(open_tag); cancel_bgcolor(NULL, c); } diff -r 1adc71ed6d45 -r 3d9d3d21e600 src/gtkimhtml.c --- a/src/gtkimhtml.c Wed Dec 03 02:03:44 2003 +0000 +++ b/src/gtkimhtml.c Wed Dec 03 04:17:42 2003 +0000 @@ -520,6 +520,9 @@ imhtml->edit.bold = NULL; imhtml->edit.italic = NULL; imhtml->edit.underline = NULL; + imhtml->edit.forecolor = NULL; + imhtml->edit.backcolor = NULL; + imhtml->format_spans = NULL; imhtml->scalables = NULL; @@ -1975,13 +1978,20 @@ gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "ITALICS", &italic, iter); } - - if ((span = imhtml->edit.underline)) { - GtkTextIter underline; - gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &underline, span->start); + if ((span = imhtml->edit.forecolor)) { + GtkTextIter fore; + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &fore, span->start); gtk_text_iter_forward_chars(iter, len); - gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "UNDERLINE", &underline, iter); + gtk_text_buffer_apply_tag(imhtml->text_buffer, span->tag, &fore, iter); } + + if ((span = imhtml->edit.backcolor)) { + GtkTextIter back; + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &back, span->start); + gtk_text_iter_forward_chars(iter, len); + gtk_text_buffer_apply_tag(imhtml->text_buffer, span->tag, &back, iter); + } + } void gtk_imhtml_set_editable(GtkIMHtml *imhtml, gboolean editable) @@ -2009,6 +2019,7 @@ span->end = NULL; span->end_tag = g_strdup(""); span->buffer = imhtml->text_buffer; + span->tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "BOLD"); imhtml->edit.bold = span; imhtml->format_spans = g_list_append(imhtml->format_spans, span); } else { @@ -2032,6 +2043,7 @@ span->end = NULL; span->end_tag = g_strdup(""); span->buffer = imhtml->text_buffer; + span->tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "ITALIC"); imhtml->edit.italic = span; imhtml->format_spans = g_list_append(imhtml->format_spans, span); } else { @@ -2041,6 +2053,7 @@ } return imhtml->edit.italic != NULL; } + gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml) { GtkIMHtmlFormatSpan *span; @@ -2054,6 +2067,7 @@ span->end = NULL; span->end_tag = g_strdup(""); span->buffer = imhtml->text_buffer; + span->tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "UNDERLINE"); imhtml->edit.underline = span; imhtml->format_spans = g_list_append(imhtml->format_spans, span); } else { @@ -2064,6 +2078,54 @@ return imhtml->edit.underline != NULL; } +gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) +{ + GtkIMHtmlFormatSpan *span; + GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); + GtkTextIter iter; + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); + if (!imhtml->edit.forecolor) { + span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); + span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); + span->start_tag = g_strdup_printf("", color); + span->end = NULL; + span->end_tag = g_strdup(""); + span->buffer = imhtml->text_buffer; + span->tag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "foreground", color, NULL); + imhtml->edit.forecolor = span; + imhtml->format_spans = g_list_append(imhtml->format_spans, span); + } else { + span = imhtml->edit.forecolor; + span->end = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); + imhtml->edit.forecolor = NULL; + } + return imhtml->edit.forecolor != NULL; +} + +gboolean gtk_imhtml_toggle_backcolor(GtkIMHtml *imhtml, const char *color) +{ + GtkIMHtmlFormatSpan *span; + GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); + GtkTextIter iter; + gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &iter, ins); + if (!imhtml->edit.backcolor) { + span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); + span->start = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); + span->start_tag = g_strdup_printf("", color); + span->end = NULL; + span->end_tag = g_strdup(""); + span->buffer = imhtml->text_buffer; + span->tag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "background", color, NULL); + imhtml->edit.backcolor = span; + imhtml->format_spans = g_list_append(imhtml->format_spans, span); + } else { + span = imhtml->edit.backcolor; + span->end = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); + imhtml->edit.backcolor = NULL; + } + return imhtml->edit.backcolor != NULL; +} + void gtk_imhtml_insert_link(GtkIMHtml *imhtml, const char *url, const char *text) { GtkIMHtmlFormatSpan *span = g_malloc(sizeof(GtkIMHtmlFormatSpan)); diff -r 1adc71ed6d45 -r 3d9d3d21e600 src/gtkimhtml.h --- a/src/gtkimhtml.h Wed Dec 03 02:03:44 2003 +0000 +++ b/src/gtkimhtml.h Wed Dec 03 04:17:42 2003 +0000 @@ -56,6 +56,7 @@ char *start_tag; char *end_tag; GtkTextBuffer *buffer; + GtkTextTag *tag; } GtkIMHtmlFormatSpan; struct _GtkIMHtml { @@ -88,6 +89,8 @@ GtkIMHtmlFormatSpan *bold; GtkIMHtmlFormatSpan *italic; GtkIMHtmlFormatSpan *underline; + GtkIMHtmlFormatSpan *forecolor; + GtkIMHtmlFormatSpan *backcolor; } edit; GList *format_spans; }; @@ -206,6 +209,9 @@ gboolean gtk_imhtml_toggle_bold(GtkIMHtml *imhtml); gboolean gtk_imhtml_toggle_italic(GtkIMHtml *imhtml); gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml); +gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color); +gboolean gtk_imhtml_toggle_backcolor(GtkIMHtml *imhtml, const char *color); + void gtk_imhtml_insert_link(GtkIMHtml *imhtml, const char *url, const char *text); char *gtk_imhtml_get_markup(GtkIMHtml *imhtml);