# HG changeset patch # User Richard Laager # Date 1124079322 0 # Node ID 477e5cca828796bbfbdebd5a63d85d938ac01423 # Parent a0e769ca84cf1ef2ec092f58cb3ed3df777123ba [gaim-migrate @ 13449] Combining the Message Text tab in the preferences into the Conversation tab. Along the way, I found and fixed a number of bugs relating to the formatting toolbar, etc. This also includes part of patch #1240388 from Sadrul. I'm still seeing a couple bugs with the backcolor stuff, but I confirmed they were there before this change. Hopefully I haven't introduced any new bugs. Holler at me if I did. committer: Tailor Script diff -r a0e769ca84cf -r 477e5cca8287 plugins/ChangeLog.API --- a/plugins/ChangeLog.API Mon Aug 15 04:15:11 2005 +0000 +++ b/plugins/ChangeLog.API Mon Aug 15 04:15:22 2005 +0000 @@ -68,6 +68,9 @@ to send messages to the specified account * Changed: A new blocked icon: pixmaps/status/default/blocked.png * Removed: All warning stuff from the core. + * Changed: gtk_imhtml_toggle_bold, gtk_imhtml_toggle_italic, + gtk_imhtml_toggle_underline, gtk_imhtml_toggle_strike: + no longer return a value Signals: * Changed: "received-im-msg" and "received-chat-msg" to match, both diff -r a0e769ca84cf -r 477e5cca8287 src/gtkconv.c --- a/src/gtkconv.c Mon Aug 15 04:15:11 2005 +0000 +++ b/src/gtkconv.c Mon Aug 15 04:15:22 2005 +0000 @@ -300,64 +300,85 @@ } static void +clear_format(GaimGtkConversation *c) +{ + gboolean bold, italic, uline; + bold = italic = uline = FALSE; + + gtk_imhtml_get_current_format(GTK_IMHTML(c->entry), &bold, &italic, &uline); + if (bold) + gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); + if (italic) + gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); + if (uline) + gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); + + gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), 3); + gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), NULL); + + gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), NULL); + gtk_imhtml_toggle_backcolor(GTK_IMHTML(c->entry), NULL); + gtk_imhtml_toggle_background(GTK_IMHTML(c->entry), NULL); + + gtk_widget_grab_focus(c->entry); +} + +static void default_formatize(GaimGtkConversation *c) { GaimConversation *conv = c->active_conv; if (conv->features & GAIM_CONNECTION_HTML) { - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_formatting")) + char *color; + GdkColor fg_color, bg_color; + + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold") != GTK_IMHTML(c->entry)->edit.bold) + gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); + + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic") != GTK_IMHTML(c->entry)->edit.italic) + gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); + + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline") != GTK_IMHTML(c->entry)->edit.underline) + gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); + + gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), + gaim_prefs_get_string("/gaim/gtk/conversations/font_face")); + + if (!(conv->features & GAIM_CONNECTION_NO_FONTSIZE)) + gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), + gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); + + if(strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), "") != 0) { - char *color; - GdkColor fg_color, bg_color; - - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold") != GTK_IMHTML(c->entry)->edit.bold) - gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); - - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic") != GTK_IMHTML(c->entry)->edit.italic) - gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); - - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline") != GTK_IMHTML(c->entry)->edit.underline) - gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); - - gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), - gaim_prefs_get_string("/gaim/gtk/conversations/font_face")); - - if (!(conv->features & GAIM_CONNECTION_NO_FONTSIZE)) - gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), - gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); - - if(strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), "") != 0) - { - gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), - &fg_color); - color = g_strdup_printf("#%02x%02x%02x", - fg_color.red / 256, - fg_color.green / 256, - fg_color.blue / 256); - } - else - color = g_strdup(""); - - gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color); - g_free(color); - - if(!(conv->features & GAIM_CONNECTION_NO_BGCOLOR) && - strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), "") != 0) - { - gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), - &bg_color); - color = g_strdup_printf("#%02x%02x%02x", - bg_color.red / 256, - bg_color.green / 256, - bg_color.blue / 256); - } - else - color = g_strdup(""); - - gtk_imhtml_toggle_backcolor(GTK_IMHTML(c->entry), color); - g_free(color); + gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), + &fg_color); + color = g_strdup_printf("#%02x%02x%02x", + fg_color.red / 256, + fg_color.green / 256, + fg_color.blue / 256); } + else + color = g_strdup(""); + + gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color); + g_free(color); + + if(!(conv->features & GAIM_CONNECTION_NO_BGCOLOR) && + strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), "") != 0) + { + gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), + &bg_color); + color = g_strdup_printf("#%02x%02x%02x", + bg_color.red / 256, + bg_color.green / 256, + bg_color.blue / 256); + } + else + color = g_strdup(""); + + gtk_imhtml_toggle_background(GTK_IMHTML(c->entry), color); + g_free(color); if (conv->features & GAIM_CONNECTION_FORMATTING_WBFO) @@ -586,7 +607,6 @@ if (check_for_and_do_command(conv)) { gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); - default_formatize(gtkconv); return; } @@ -628,7 +648,6 @@ g_free(buf); gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); - default_formatize(gtkconv); } static void @@ -1771,6 +1790,7 @@ conv->send_history = conv->send_history->next; gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); + clear_format(gtkconv); gtk_imhtml_append_text_with_images( GTK_IMHTML(gtkconv->entry), conv->send_history->data, 0, NULL); @@ -1794,13 +1814,19 @@ conv->send_history = conv->send_history->prev; gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); + clear_format(gtkconv); gtk_imhtml_append_text_with_images( GTK_IMHTML(gtkconv->entry), conv->send_history->data, 0, NULL); /* this is mainly just a hack so the formatting at the * cursor gets picked up. */ - gtk_text_buffer_get_end_iter(buffer, &iter); - gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); + if (*(char *)conv->send_history->data) { + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); + } else { + /* Restore the default formatting */ + default_formatize(gtkconv); + } } return TRUE; @@ -4998,7 +5024,7 @@ gtk_font_options |= GTK_IMHTML_NO_COMMENTS; - if (gaim_prefs_get_bool("/gaim/gtk/conversations/ignore_formatting")) + if (!gaim_prefs_get_bool("/gaim/gtk/conversations/show_incoming_formatting")) gtk_font_options |= GTK_IMHTML_NO_COLOURS | GTK_IMHTML_NO_FONTS | GTK_IMHTML_NO_SIZES; /* this is gonna crash one day, I can feel it. */ @@ -6207,13 +6233,8 @@ gaim_prefs_add_bool("/gaim/gtk/conversations/send_italic", FALSE); gaim_prefs_add_bool("/gaim/gtk/conversations/send_underline", FALSE); gaim_prefs_add_bool("/gaim/gtk/conversations/spellcheck", TRUE); -#if 0 - gaim_prefs_add_bool("/gaim/gtk/conversations/ignore_colors", FALSE); - gaim_prefs_add_bool("/gaim/gtk/conversations/ignore_fonts", FALSE); - gaim_prefs_add_bool("/gaim/gtk/conversations/ignore_font_sizes", FALSE); -#else - gaim_prefs_add_bool("/gaim/gtk/conversations/ignore_formatting", FALSE); -#endif + gaim_prefs_add_bool("/gaim/gtk/conversations/show_incoming_formatting", TRUE); + gaim_prefs_add_bool("/gaim/gtk/conversations/show_formatting_toolbar", TRUE); gaim_prefs_add_bool("/gaim/gtk/conversations/passthrough_unknown_commands", FALSE); diff -r a0e769ca84cf -r 477e5cca8287 src/gtkimhtml.c --- a/src/gtkimhtml.c Mon Aug 15 04:15:11 2005 +0000 +++ b/src/gtkimhtml.c Mon Aug 15 04:15:22 2005 +0000 @@ -108,6 +108,12 @@ static void paste_received_cb (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer data); static void paste_plaintext_received_cb (GtkClipboard *clipboard, const gchar *text, gpointer data); static void imhtml_paste_insert(GtkIMHtml *imhtml, const char *text, gboolean plaintext); +static void imhtml_toggle_bold(GtkIMHtml *imhtml); +static void imhtml_toggle_italic(GtkIMHtml *imhtml); +static void imhtml_toggle_strike(GtkIMHtml *imhtml); +static void imhtml_toggle_underline(GtkIMHtml *imhtml); +static void imhtml_font_grow(GtkIMHtml *imhtml); +static void imhtml_font_shrink(GtkIMHtml *imhtml); /* POINT_SIZE converts from AIM font sizes to a point size scale factor. */ #define MAX_FONT_SIZE 7 @@ -952,9 +958,9 @@ gtk_imhtml_close_tags(imhtml, &iter); gtk_imhtml_insert_html_at_iter(imhtml, text, flags, &iter); - if (!imhtml->wbfo && !plaintext) - gtk_imhtml_close_tags(imhtml, &iter); - gtk_text_buffer_move_mark_by_name(imhtml->text_buffer, "insert", &iter); + if (!imhtml->wbfo && !plaintext) + gtk_imhtml_close_tags(imhtml, &iter); + gtk_text_buffer_move_mark_by_name(imhtml->text_buffer, "insert", &iter); gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(imhtml), gtk_text_buffer_get_insert(imhtml->text_buffer), 0, FALSE, 0.0, 0.0); } @@ -1112,19 +1118,22 @@ switch (buttons) { case GTK_IMHTML_BOLD: - gtk_imhtml_toggle_bold(imhtml); + imhtml_toggle_bold(imhtml); break; case GTK_IMHTML_ITALIC: - gtk_imhtml_toggle_italic(imhtml); + imhtml_toggle_italic(imhtml); break; case GTK_IMHTML_UNDERLINE: - gtk_imhtml_toggle_underline(imhtml); + imhtml_toggle_underline(imhtml); + break; + case GTK_IMHTML_STRIKE: + imhtml_toggle_strike(imhtml); break; case GTK_IMHTML_SHRINK: - gtk_imhtml_font_shrink(imhtml); + imhtml_font_shrink(imhtml); break; case GTK_IMHTML_GROW: - gtk_imhtml_font_grow(imhtml); + imhtml_font_grow(imhtml); break; default: break; @@ -3799,6 +3808,15 @@ return NULL; } +char * +gtk_imhtml_get_current_background(GtkIMHtml *imhtml) +{ + if (imhtml->edit.background) + return g_strdup(imhtml->edit.background); + else + return NULL; +} + gint gtk_imhtml_get_current_fontsize(GtkIMHtml *imhtml) { @@ -3886,9 +3904,8 @@ g_slist_free(tags); } -gboolean gtk_imhtml_toggle_bold(GtkIMHtml *imhtml) +static void imhtml_toggle_bold(GtkIMHtml *imhtml) { - GObject *object; GtkTextIter start, end; imhtml->edit.bold = !imhtml->edit.bold; @@ -3906,15 +3923,21 @@ gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "BOLD", &start, &end); } - object = g_object_ref(G_OBJECT(imhtml)); - g_object_unref(object); - - return (imhtml->edit.bold != FALSE); } -gboolean gtk_imhtml_toggle_italic(GtkIMHtml *imhtml) +void gtk_imhtml_toggle_bold(GtkIMHtml *imhtml) { GObject *object; + + g_return_if_fail(imhtml != NULL); + + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_BOLD); + g_object_unref(object); +} + +static void imhtml_toggle_italic(GtkIMHtml *imhtml) +{ GtkTextIter start, end; imhtml->edit.italic = !imhtml->edit.italic; @@ -3931,15 +3954,20 @@ else gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "ITALICS", &start, &end); } - object = g_object_ref(G_OBJECT(imhtml)); - g_object_unref(object); - - return imhtml->edit.italic != FALSE; } -gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml) +void gtk_imhtml_toggle_italic(GtkIMHtml *imhtml) { GObject *object; + + g_return_if_fail(imhtml != NULL); + + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_ITALIC); + g_object_unref(object);} + +static void imhtml_toggle_underline(GtkIMHtml *imhtml) +{ GtkTextIter start, end; imhtml->edit.underline = !imhtml->edit.underline; @@ -3956,15 +3984,21 @@ else gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "UNDERLINE", &start, &end); } - object = g_object_ref(G_OBJECT(imhtml)); - g_object_unref(object); - - return imhtml->edit.underline != FALSE; } -gboolean gtk_imhtml_toggle_strike(GtkIMHtml *imhtml) +void gtk_imhtml_toggle_underline(GtkIMHtml *imhtml) { GObject *object; + + g_return_if_fail(imhtml != NULL); + + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_UNDERLINE); + g_object_unref(object); +} + +static void imhtml_toggle_strike(GtkIMHtml *imhtml) +{ GtkTextIter start, end; imhtml->edit.strike = !imhtml->edit.strike; @@ -3981,21 +4015,26 @@ else gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "STRIKE", &start, &end); } +} + +void gtk_imhtml_toggle_strike(GtkIMHtml *imhtml) +{ + GObject *object; + + g_return_if_fail(imhtml != NULL); + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_STRIKE); g_object_unref(object); - - return imhtml->edit.strike != FALSE; } void gtk_imhtml_font_set_size(GtkIMHtml *imhtml, gint size) { GObject *object; GtkTextIter start, end; - GtkIMHtmlButtons b = 0; imhtml->edit.fontsize = size; - if (imhtml->wbfo) { gtk_text_buffer_get_bounds(imhtml->text_buffer, &start, &end); remove_font_size(imhtml, &start, &end, TRUE); @@ -4008,14 +4047,12 @@ } object = g_object_ref(G_OBJECT(imhtml)); - b |= GTK_IMHTML_SHRINK; - b |= GTK_IMHTML_GROW; + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_SHRINK | GTK_IMHTML_GROW); g_object_unref(object); } -void gtk_imhtml_font_shrink(GtkIMHtml *imhtml) +static void imhtml_font_shrink(GtkIMHtml *imhtml) { - GObject *object; GtkTextIter start, end; if (imhtml->edit.fontsize == 1) @@ -4036,13 +4073,21 @@ gtk_text_buffer_apply_tag(imhtml->text_buffer, find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); } +} + +void gtk_imhtml_font_shrink(GtkIMHtml *imhtml) +{ + GObject *object; + + g_return_if_fail(imhtml != NULL); + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_SHRINK); g_object_unref(object); } -void gtk_imhtml_font_grow(GtkIMHtml *imhtml) +static void imhtml_font_grow(GtkIMHtml *imhtml) { - GObject *object; GtkTextIter start, end; if (imhtml->edit.fontsize == MAX_FONT_SIZE) @@ -4063,11 +4108,20 @@ gtk_text_buffer_apply_tag(imhtml->text_buffer, find_font_size_tag(imhtml, imhtml->edit.fontsize), &start, &end); } +} + +void gtk_imhtml_font_grow(GtkIMHtml *imhtml) +{ + GObject *object; + + g_return_if_fail(imhtml != NULL); + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, GTK_IMHTML_GROW); g_object_unref(object); } -#define gtk_imhtml_toggle_str_tag(imhtml, color, edit_field, remove_func, find_func) { \ +#define gtk_imhtml_toggle_str_tag(imhtml, color, edit_field, remove_func, find_func, button) { \ GObject *object; \ GtkTextIter start, end; \ \ @@ -4101,6 +4155,7 @@ } \ \ object = g_object_ref(G_OBJECT(imhtml)); \ + g_signal_emit(object, signals[TOGGLE_FORMAT], 0, button); \ g_object_unref(object); \ \ return edit_field != NULL; \ @@ -4108,22 +4163,22 @@ gboolean gtk_imhtml_toggle_forecolor(GtkIMHtml *imhtml, const char *color) { - gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.forecolor, remove_font_forecolor, find_font_forecolor_tag); + gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.forecolor, remove_font_forecolor, find_font_forecolor_tag, GTK_IMHTML_FORECOLOR); } gboolean gtk_imhtml_toggle_backcolor(GtkIMHtml *imhtml, const char *color) { - gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.backcolor, remove_font_backcolor, find_font_backcolor_tag); + gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.backcolor, remove_font_backcolor, find_font_backcolor_tag, GTK_IMHTML_BACKCOLOR); } gboolean gtk_imhtml_toggle_background(GtkIMHtml *imhtml, const char *color) { - gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.background, remove_font_background, find_font_background_tag); + gtk_imhtml_toggle_str_tag(imhtml, color, imhtml->edit.background, remove_font_background, find_font_background_tag, GTK_IMHTML_BACKGROUND); } gboolean gtk_imhtml_toggle_fontface(GtkIMHtml *imhtml, const char *face) { - gtk_imhtml_toggle_str_tag(imhtml, face, imhtml->edit.fontface, remove_font_face, find_font_face_tag); + gtk_imhtml_toggle_str_tag(imhtml, face, imhtml->edit.fontface, remove_font_face, find_font_face_tag, GTK_IMHTML_FACE); } void gtk_imhtml_toggle_link(GtkIMHtml *imhtml, const char *url) @@ -4137,8 +4192,6 @@ imhtml->edit.link = NULL; - - if (url) { g_snprintf(str, sizeof(str), "LINK %d", linkno++); str[47] = '\0'; diff -r a0e769ca84cf -r 477e5cca8287 src/gtkimhtml.h --- a/src/gtkimhtml.h Mon Aug 15 04:15:11 2005 +0000 +++ b/src/gtkimhtml.h Mon Aug 15 04:15:22 2005 +0000 @@ -579,37 +579,29 @@ * Toggles bold at the cursor location or selection in a GTK+ IM/HTML. * * @param imhtml The GTK+ IM/HTML. - * - * @return @c TRUE if bold was turned on, or @c FALSE if it was turned off. */ -gboolean gtk_imhtml_toggle_bold(GtkIMHtml *imhtml); +void gtk_imhtml_toggle_bold(GtkIMHtml *imhtml); /** * Toggles italic at the cursor location or selection in a GTK+ IM/HTML. * * @param imhtml The GTK+ IM/HTML. - * - * @return @c TRUE if italic was turned on, or @c FALSE if it was turned off. */ -gboolean gtk_imhtml_toggle_italic(GtkIMHtml *imhtml); +void gtk_imhtml_toggle_italic(GtkIMHtml *imhtml); /** * Toggles underline at the cursor location or selection in a GTK+ IM/HTML. * * @param imhtml The GTK+ IM/HTML. - * - * @return @c TRUE if underline was turned on, or @c FALSE if it was turned off. */ -gboolean gtk_imhtml_toggle_underline(GtkIMHtml *imhtml); +void gtk_imhtml_toggle_underline(GtkIMHtml *imhtml); /** * Toggles strikethrough at the cursor location or selection in a GTK+ IM/HTML. * * @param imhtml The GTK+ IM/HTML. - * - * @return @c TRUE if strikethrough was turned on, or @c FALSE if it was turned off. */ -gboolean gtk_imhtml_toggle_strike(GtkIMHtml *imhtml); +void gtk_imhtml_toggle_strike(GtkIMHtml *imhtml); /** * Toggles a foreground color at the current location or selection in a GTK diff -r a0e769ca84cf -r 477e5cca8287 src/gtkimhtmltoolbar.c --- a/src/gtkimhtmltoolbar.c Mon Aug 15 04:15:11 2005 +0000 +++ b/src/gtkimhtmltoolbar.c Mon Aug 15 04:15:22 2005 +0000 @@ -40,67 +40,32 @@ static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar) { - GObject *object; - - g_return_if_fail(toolbar); - - /* block the format_function_toggle handler */ - object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); - g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); + g_return_if_fail(toolbar != NULL); gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml)); - g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); - g_object_unref(object); - gtk_widget_grab_focus(toolbar->imhtml); } static void do_italic(GtkWidget *italic, GtkIMHtmlToolbar *toolbar) { - GObject *object; - - g_return_if_fail(toolbar); - - /* block the format_function_toggle handler */ - object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); - g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); + g_return_if_fail(toolbar != NULL); gtk_imhtml_toggle_italic(GTK_IMHTML(toolbar->imhtml)); - g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); - g_object_unref(object); - gtk_widget_grab_focus(toolbar->imhtml); } static void do_underline(GtkWidget *underline, GtkIMHtmlToolbar *toolbar) { - GObject *object; - - g_return_if_fail(toolbar); - - /* block the format_function_toggle handler */ - object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); - g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); + g_return_if_fail(toolbar != NULL); gtk_imhtml_toggle_underline(GTK_IMHTML(toolbar->imhtml)); - g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, - NULL, toolbar); - g_object_unref(object); - gtk_widget_grab_focus(toolbar->imhtml); } static void do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar) { - g_return_if_fail(toolbar); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size))) - gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size), FALSE); + g_return_if_fail(toolbar != NULL); + gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml)); gtk_widget_grab_focus(toolbar->imhtml); } @@ -108,9 +73,7 @@ do_big(GtkWidget *large, GtkIMHtmlToolbar *toolbar) { g_return_if_fail(toolbar); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->larger_size))) - gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE); + gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); gtk_widget_grab_focus(toolbar->imhtml); } @@ -119,7 +82,7 @@ GtkIMHtmlToolbar *toolbar) { if (widget != NULL) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->font), FALSE); + gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml), ""); if (toolbar->font_dialog != NULL) { @@ -161,7 +124,6 @@ *space = '\0'; gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml), fontname); - g_free(fontname); cancel_toolbar_font(NULL, toolbar); @@ -170,40 +132,39 @@ static void toggle_font(GtkWidget *font, GtkIMHtmlToolbar *toolbar) { - char *fontname; - g_return_if_fail(toolbar); - fontname = gtk_imhtml_get_current_fontface(GTK_IMHTML(toolbar->imhtml)); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(font))) { + char *fontname = gtk_imhtml_get_current_fontface(GTK_IMHTML(toolbar->imhtml)); - if (!toolbar->font_dialog) { - toolbar->font_dialog = gtk_font_selection_dialog_new(_("Select Font")); + if (!toolbar->font_dialog) { + toolbar->font_dialog = gtk_font_selection_dialog_new(_("Select Font")); - g_object_set_data(G_OBJECT(toolbar->font_dialog), "gaim_toolbar", toolbar); + g_object_set_data(G_OBJECT(toolbar->font_dialog), "gaim_toolbar", toolbar); - if(fontname) { - char fonttif[128]; - g_snprintf(fonttif, sizeof(fonttif), "%s 12", fontname); - gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), - fonttif); - g_free(fontname); - } else { - gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), - DEFAULT_FONT_FACE); + if(fontname) { + char *fonttif = g_strdup_printf("%s 12", fontname); + g_free(fontname); + gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), + fonttif); + g_free(fonttif); + } else { + gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), + DEFAULT_FONT_FACE); + } + + g_signal_connect(G_OBJECT(toolbar->font_dialog), "delete_event", + G_CALLBACK(destroy_toolbar_font), toolbar); + g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->ok_button), "clicked", + G_CALLBACK(apply_font), toolbar->font_dialog); + g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->cancel_button), "clicked", + G_CALLBACK(cancel_toolbar_font), toolbar); + g_signal_connect_after(G_OBJECT(toolbar->font_dialog), "realize", + G_CALLBACK(realize_toolbar_font), toolbar); } - - g_signal_connect(G_OBJECT(toolbar->font_dialog), "delete_event", - G_CALLBACK(destroy_toolbar_font), toolbar); - g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->ok_button), "clicked", - G_CALLBACK(apply_font), toolbar->font_dialog); - g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->cancel_button), "clicked", - G_CALLBACK(cancel_toolbar_font), toolbar); - g_signal_connect_after(G_OBJECT(toolbar->font_dialog), "realize", - G_CALLBACK(realize_toolbar_font), toolbar); - gtk_window_present(GTK_WINDOW(toolbar->font_dialog)); } else { - cancel_toolbar_font(NULL, toolbar); + cancel_toolbar_font(font, toolbar); } gtk_widget_grab_focus(toolbar->imhtml); } @@ -213,7 +174,7 @@ GtkIMHtmlToolbar *toolbar) { if (widget != NULL) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->fgcolor), FALSE); + gtk_imhtml_toggle_forecolor(GTK_IMHTML(toolbar->imhtml), ""); if (toolbar->fgcolor_dialog != NULL) { @@ -241,8 +202,8 @@ text_color.green / 256, text_color.blue / 256); gtk_imhtml_toggle_forecolor(GTK_IMHTML(toolbar->imhtml), open_tag); + g_free(open_tag); - g_free(open_tag); cancel_toolbar_fgcolor(NULL, toolbar); } @@ -272,13 +233,10 @@ G_CALLBACK(do_fgcolor), colorsel); g_signal_connect(G_OBJECT (GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->cancel_button), "clicked", G_CALLBACK(cancel_toolbar_fgcolor), toolbar); - } gtk_window_present(GTK_WINDOW(toolbar->fgcolor_dialog)); - } else if (toolbar->fgcolor_dialog != NULL) { + } else { cancel_toolbar_fgcolor(color, toolbar); - } else { - /* gaim_gtk_advance_past(gtkconv, "", ""); */ } gtk_widget_grab_focus(toolbar->imhtml); } @@ -287,8 +245,12 @@ destroy_toolbar_bgcolor(GtkWidget *widget, GdkEvent *event, GtkIMHtmlToolbar *toolbar) { - if (widget != NULL) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->bgcolor), FALSE); + if (widget != NULL) { + if (gtk_text_buffer_get_selection_bounds(GTK_IMHTML(toolbar->imhtml)->text_buffer, NULL, NULL)) + gtk_imhtml_toggle_backcolor(GTK_IMHTML(toolbar->imhtml), ""); + else + gtk_imhtml_toggle_background(GTK_IMHTML(toolbar->imhtml), ""); + } if (toolbar->bgcolor_dialog != NULL) { @@ -319,8 +281,8 @@ gtk_imhtml_toggle_backcolor(GTK_IMHTML(toolbar->imhtml), open_tag); else gtk_imhtml_toggle_background(GTK_IMHTML(toolbar->imhtml), open_tag); + g_free(open_tag); - g_free(open_tag); cancel_toolbar_bgcolor(NULL, toolbar); } @@ -353,10 +315,8 @@ } gtk_window_present(GTK_WINDOW(toolbar->bgcolor_dialog)); - } else if (toolbar->bgcolor_dialog != NULL) { + } else { cancel_toolbar_bgcolor(color, toolbar); - } else { - /* gaim_gtk_advance_past(gtkconv, "", ""); */ } gtk_widget_grab_focus(toolbar->imhtml); } @@ -805,24 +765,6 @@ g_object_unref(object); } -static void toggle_button_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) -{ - if (buttons & GTK_IMHTML_BOLD) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), - !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)), - toolbar); - - if (buttons & GTK_IMHTML_ITALIC) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), - !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)), - toolbar); - - if (buttons & GTK_IMHTML_UNDERLINE) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), - !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)), - toolbar); -} - static void reset_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar) { if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold))) @@ -840,6 +782,8 @@ static void update_buttons(GtkIMHtmlToolbar *toolbar) { gboolean bold, italic, underline; + char *tmp; + char *tmp2; bold = italic = underline = FALSE; gtk_imhtml_get_current_format(GTK_IMHTML(toolbar->imhtml), @@ -856,6 +800,32 @@ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)) != underline) toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), underline, toolbar); + + /* These buttons aren't ever "active". */ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size), FALSE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE); + + tmp = gtk_imhtml_get_current_fontface(GTK_IMHTML(toolbar->imhtml)); + toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->font), + (tmp != NULL), toolbar); + g_free(tmp); + + tmp = gtk_imhtml_get_current_forecolor(GTK_IMHTML(toolbar->imhtml)); + toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->fgcolor), + (tmp != NULL), toolbar); + g_free(tmp); + + tmp = gtk_imhtml_get_current_backcolor(GTK_IMHTML(toolbar->imhtml)); + tmp2 = gtk_imhtml_get_current_background(GTK_IMHTML(toolbar->imhtml)); + toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bgcolor), + (tmp != NULL || tmp2 != NULL), toolbar); + g_free(tmp); + g_free(tmp2); +} + +static void toggle_button_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) +{ + update_buttons(toolbar); } static void update_format_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar) { @@ -1117,7 +1087,7 @@ toolbar->imhtml = imhtml; g_signal_connect(G_OBJECT(imhtml), "format_buttons_update", G_CALLBACK(update_buttons_cb), toolbar); - g_signal_connect(G_OBJECT(imhtml), "format_function_toggle", G_CALLBACK(toggle_button_cb), toolbar); + g_signal_connect_after(G_OBJECT(imhtml), "format_function_toggle", G_CALLBACK(toggle_button_cb), toolbar); g_signal_connect(G_OBJECT(imhtml), "format_function_clear", G_CALLBACK(reset_buttons_cb), toolbar); g_signal_connect(G_OBJECT(imhtml), "format_function_update", G_CALLBACK(update_format_cb), toolbar); g_signal_connect_after(G_OBJECT(GTK_IMHTML(imhtml)->text_buffer), "mark-set", G_CALLBACK(mark_set_cb), toolbar); @@ -1129,17 +1099,7 @@ gtk_imhtml_get_current_format(GTK_IMHTML(imhtml), &bold, &italic, &underline); - if(bold) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), bold, - toolbar); - - if(italic) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), italic, - toolbar); - - if(underline) - toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), - underline, toolbar); + update_buttons(toolbar); } void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id) diff -r a0e769ca84cf -r 477e5cca8287 src/gtkprefs.c --- a/src/gtkprefs.c Mon Aug 15 04:15:11 2005 +0000 +++ b/src/gtkprefs.c Mon Aug 15 04:15:22 2005 +0000 @@ -205,7 +205,7 @@ GaimPrefType type, const char *key, GList *menuitems) { GtkWidget *dropdown, *opt, *menu; - GtkWidget *label; + GtkWidget *label = NULL; GtkWidget *hbox; gchar *text; const char *stored_str = NULL; @@ -216,14 +216,18 @@ g_return_val_if_fail(menuitems != NULL, NULL); - hbox = gtk_hbox_new(FALSE, 5); - /*gtk_container_add (GTK_CONTAINER (box), hbox);*/ - gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - label = gtk_label_new_with_mnemonic(title); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_widget_show(label); + if (title != NULL) { + hbox = gtk_hbox_new(FALSE, 5); + /*gtk_container_add (GTK_CONTAINER (box), hbox);*/ + gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new_with_mnemonic(title); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + } else { + hbox = box; + } #if 0 /* GTK_CHECK_VERSION(2,4,0) */ if(type == GAIM_PREF_INT) @@ -236,7 +240,10 @@ menu = gtk_menu_new(); #endif - gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown); + if (label != NULL) { + gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown); + gaim_set_accessible_label (dropdown, label); + } if (type == GAIM_PREF_INT) stored_int = gaim_prefs_get_int(key); @@ -289,7 +296,6 @@ gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); gtk_widget_show(dropdown); - gaim_set_accessible_label (dropdown, label); return label; } @@ -741,26 +747,7 @@ } static void -formatting_reset_cb(GtkWidget *w, GtkWidget *imhtml) { - gboolean bold, italic, uline; - bold = italic = uline = FALSE; - - gtk_imhtml_get_current_format(GTK_IMHTML(imhtml), &bold, &italic, &uline); - if (bold) - gtk_imhtml_toggle_bold(GTK_IMHTML(imhtml)); - if (italic) - gtk_imhtml_toggle_italic(GTK_IMHTML(imhtml)); - if (uline) - gtk_imhtml_toggle_underline(GTK_IMHTML(imhtml)); - - gtk_imhtml_font_set_size(GTK_IMHTML(imhtml), 3); - gtk_imhtml_toggle_forecolor(GTK_IMHTML(imhtml), NULL); - gtk_imhtml_toggle_backcolor(GTK_IMHTML(imhtml), NULL); - gtk_imhtml_toggle_fontface(GTK_IMHTML(imhtml), NULL); -} - -static void -formatting_toggle_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *bah) +formatting_toggle_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *toolbar) { gboolean bold, italic, uline; @@ -797,7 +784,32 @@ } if (buttons & GTK_IMHTML_BACKCOLOR) { - char *color = gtk_imhtml_get_current_backcolor(GTK_IMHTML(imhtml)); + char *color; + GObject *object; + + color = gtk_imhtml_get_current_backcolor(GTK_IMHTML(imhtml)); + if (!color) + color = g_strdup(""); + + /* Block the signal to prevent a loop. */ + object = g_object_ref(G_OBJECT(imhtml)); + g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, + NULL, toolbar); + /* Clear the backcolor. */ + gtk_imhtml_toggle_backcolor(GTK_IMHTML(imhtml), ""); + /* Unblock the signal. */ + g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, + NULL, toolbar); + g_object_unref(object); + + /* This will fire a toggle signal and get saved below. */ + gtk_imhtml_toggle_background(GTK_IMHTML(imhtml), color); + + g_free(color); + } + + if (buttons & GTK_IMHTML_BACKGROUND) { + char *color = gtk_imhtml_get_current_background(GTK_IMHTML(imhtml)); if (!color) color = g_strdup(""); @@ -806,73 +818,27 @@ } } -static GtkWidget * -messages_page() -{ - GtkWidget *ret; - GtkWidget *vbox, *fontvbox; - GtkWidget *imhtml; - GtkWidget *toolbar; - GtkWidget *frame; - GtkWidget *option; - GtkWidget *button; - - ret = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); - gtk_container_set_border_width (GTK_CONTAINER (ret), GAIM_HIG_BORDER); - - vbox = gaim_gtk_make_frame (ret, _("Display")); -#ifdef USE_GTKSPELL - gaim_gtk_prefs_checkbox(_("_Highlight misspelled words"), - "/gaim/gtk/conversations/spellcheck", vbox); -#endif - vbox = gaim_gtk_make_frame (ret, _("Ignore")); - gaim_gtk_prefs_checkbox(_("Ignore _formatting"), - "/gaim/gtk/conversations/ignore_formatting", vbox); - - vbox = gaim_gtk_make_frame (ret, _("Default Formatting")); - - option = gaim_gtk_prefs_checkbox(_("_Send default formatting with outgoing messages"), - "/gaim/gtk/conversations/send_formatting", vbox); - - - fontvbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(vbox), fontvbox); - - frame = gaim_gtk_create_imhtml(TRUE, &imhtml, &toolbar); - gtk_widget_set_name(imhtml, "gaim_gtkprefs_font_imhtml"); - gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(imhtml), TRUE); - gtk_imhtml_append_text(GTK_IMHTML(imhtml), _("This is how your outgoing message text will appear when you use protocols that support formatting. :)"), 0); - gtk_box_pack_start(GTK_BOX(fontvbox), frame, FALSE, FALSE, 0); - - button = gtk_button_new_with_mnemonic(_("_Clear Formatting")); - gtk_box_pack_start(GTK_BOX(fontvbox), button, FALSE, FALSE, 0); - - if (!gaim_prefs_get_bool("/gaim/gtk/conversations/send_formatting")) - gtk_widget_set_sensitive(fontvbox, FALSE); - - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) +static void +formatting_reset_cb(GtkWidget *w, GtkWidget *imhtml) { + gboolean bold, italic, uline; + bold = italic = uline = FALSE; + + gtk_imhtml_get_current_format(GTK_IMHTML(imhtml), &bold, &italic, &uline); + if (bold) gtk_imhtml_toggle_bold(GTK_IMHTML(imhtml)); - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) + if (italic) gtk_imhtml_toggle_italic(GTK_IMHTML(imhtml)); - if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) + if (uline) gtk_imhtml_toggle_underline(GTK_IMHTML(imhtml)); - gtk_imhtml_font_set_size(GTK_IMHTML(imhtml), gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); - gtk_imhtml_toggle_forecolor(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor")); - gtk_imhtml_toggle_backcolor(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor")); - gtk_imhtml_toggle_fontface(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/font_face")); - - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(formatting_reset_cb), imhtml); - - g_signal_connect(G_OBJECT(option), "clicked", - G_CALLBACK(gaim_gtk_toggle_sensitive), fontvbox); - - g_signal_connect(G_OBJECT(imhtml), "format_function_toggle", - G_CALLBACK(formatting_toggle_cb), NULL); - - gtk_widget_show_all(ret); - return ret; + gtk_imhtml_font_set_size(GTK_IMHTML(imhtml), 3); + gtk_imhtml_toggle_fontface(GTK_IMHTML(imhtml), NULL); + + gtk_imhtml_toggle_forecolor(GTK_IMHTML(imhtml), NULL); + gtk_imhtml_toggle_backcolor(GTK_IMHTML(imhtml), NULL); + gtk_imhtml_toggle_background(GTK_IMHTML(imhtml), NULL); + + gtk_widget_grab_focus(imhtml); } static GtkWidget * @@ -926,25 +892,78 @@ { GtkWidget *ret; GtkWidget *vbox, *vbox2; + GtkWidget *hbox; GtkWidget *label; - GtkSizeGroup *sg; GList *names = NULL; + GtkWidget *frame; + GtkWidget *imhtml; + GtkWidget *toolbar; + GtkWidget *button; ret = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); gtk_container_set_border_width(GTK_CONTAINER(ret), GAIM_HIG_BORDER); - sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); vbox = gaim_gtk_make_frame(ret, _("Conversations")); gaim_gtk_prefs_checkbox(_("Send unknown \"_slash\" commands as messages"), "/gaim/gtk/conversations/passthrough_unknown_commands", vbox); - + gaim_gtk_prefs_checkbox(_("Show _formatting on incoming messages"), + "/gaim/gtk/conversations/show_incoming_formatting", vbox); gaim_gtk_prefs_checkbox(_("Show buddy _icons"), "/gaim/gtk/conversations/im/show_buddy_icons", vbox); gaim_gtk_prefs_checkbox(_("Enable buddy ic_on animation"), "/gaim/gtk/conversations/im/animate_buddy_icons", vbox); gaim_gtk_prefs_checkbox(_("_Notify buddies that you are typing to them"), "/core/conversations/im/send_typing", vbox); +#ifdef USE_GTKSPELL + gaim_gtk_prefs_checkbox(_("_Highlight misspelled words"), + "/gaim/gtk/conversations/spellcheck", vbox); +#endif + + hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); + gtk_container_add(GTK_CONTAINER(vbox), hbox); + + frame = gaim_gtk_create_imhtml(TRUE, &imhtml, &toolbar); + gtk_widget_set_name(imhtml, "gaim_gtkprefs_font_imhtml"); + gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(imhtml), TRUE); + gtk_imhtml_set_format_functions(GTK_IMHTML(imhtml), + GTK_IMHTML_BOLD | + GTK_IMHTML_ITALIC | + GTK_IMHTML_UNDERLINE | + GTK_IMHTML_GROW | + GTK_IMHTML_SHRINK | + GTK_IMHTML_FACE | + GTK_IMHTML_FORECOLOR | + GTK_IMHTML_BACKCOLOR | + GTK_IMHTML_BACKGROUND); + + gtk_imhtml_append_text(GTK_IMHTML(imhtml), _("This is how your outgoing message text will appear when you use protocols that support formatting. :)"), 0); + + gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); + + vbox2 = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0); + button = gtk_button_new_with_mnemonic(_("_Clear Formatting")); + gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0); + + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) + gtk_imhtml_toggle_bold(GTK_IMHTML(imhtml)); + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) + gtk_imhtml_toggle_italic(GTK_IMHTML(imhtml)); + if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) + gtk_imhtml_toggle_underline(GTK_IMHTML(imhtml)); + + gtk_imhtml_font_set_size(GTK_IMHTML(imhtml), gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); + gtk_imhtml_toggle_forecolor(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor")); + gtk_imhtml_toggle_background(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor")); + gtk_imhtml_toggle_fontface(GTK_IMHTML(imhtml), gaim_prefs_get_string("/gaim/gtk/conversations/font_face")); + + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(formatting_reset_cb), imhtml); + + g_signal_connect_after(G_OBJECT(imhtml), "format_function_toggle", + G_CALLBACK(formatting_toggle_cb), toolbar); + /* All the tab options! */ vbox = gaim_gtk_make_frame(ret, _("Tab Options")); @@ -966,21 +985,20 @@ gaim_gtk_prefs_checkbox(_("Show close b_utton on tabs"), "/gaim/gtk/conversations/close_on_tabs", vbox2); - label = gaim_gtk_prefs_dropdown(vbox2, _("Tab p_lacement:"), GAIM_PREF_INT, + hbox = gtk_hbox_new(FALSE, 9); + gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); + + label = gaim_gtk_prefs_dropdown(hbox, _("_Placement:"), GAIM_PREF_INT, "/gaim/gtk/conversations/tab_side", _("Top"), GTK_POS_TOP, _("Bottom"), GTK_POS_BOTTOM, _("Left"), GTK_POS_LEFT, _("Right"), GTK_POS_RIGHT, NULL); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(sg, label); names = gaim_conv_placement_get_options(); - label = gaim_gtk_prefs_dropdown_from_list(vbox2, _("New conversation _placement:"), + label = gaim_gtk_prefs_dropdown_from_list(hbox, _("N_ew conversations:"), GAIM_PREF_STRING, "/gaim/gtk/conversations/placement", names); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); g_list_free(names); gtk_widget_show_all(ret); @@ -2114,7 +2132,6 @@ GList *l; prefs_notebook_add_page(_("Buddy List"), NULL, list_page(), &c, &p, notebook_page++); prefs_notebook_add_page(_("Conversations"), NULL, conv_page(), &c, &p, notebook_page++); - prefs_notebook_add_page(_("Message Text"), NULL, messages_page(), &c2, &c, notebook_page++); prefs_notebook_add_page(_("Smiley Themes"), NULL, theme_page(), &c2, &c, notebook_page++); prefs_notebook_add_page(_("Sounds"), NULL, sound_page(), &c, &p, notebook_page++); prefs_notebook_add_page(_("Network"), NULL, network_page(), &p, NULL, notebook_page++); @@ -2283,9 +2300,15 @@ "/gaim/gtk/conversations/send_formatting"); gaim_prefs_rename("/gaim/gtk/debug/timestamps", "/core/debug/timestamps"); - gaim_prefs_rename("/gaim/gtk/conversations/ignore_colors", "/gaim/gtk/conversations/ignore_formatting"); gaim_prefs_rename("/gaim/gtk/conversations/im/raise_on_events", "/plugins/gtk/X11/notify/method_raise"); + /* I'm leaving both of these to support people that were running 2.0.0cvs before this change. + * The latter can be removed before 2.0.0 is released, or after that if it's forgotten. */ + gaim_prefs_rename_boolean_toggle("/gaim/gtk/conversations/ignore_colors", + "/gaim/gtk/conversations/show_incoming_formatting"); + gaim_prefs_rename_boolean_toggle("/gaim/gtk/conversations/ignore_formatting", + "/gaim/gtk/conversations/show_incoming_formatting"); + /* Remove some no-longer-used prefs */ gaim_prefs_remove("/gaim/gtk/blist/auto_expand_contacts"); gaim_prefs_remove("/gaim/gtk/blist/button_style"); @@ -2299,6 +2322,7 @@ gaim_prefs_remove("/gaim/gtk/conversations/enter_sends"); gaim_prefs_remove("/gaim/gtk/conversations/html_shortcuts"); gaim_prefs_remove("/gaim/gtk/conversations/icons_on_tabs"); + gaim_prefs_remove("/gaim/gtk/conversations/send_formatting"); gaim_prefs_remove("/gaim/gtk/conversations/show_smileys"); gaim_prefs_remove("/gaim/gtk/conversations/show_timestamps"); gaim_prefs_remove("/gaim/gtk/conversations/show_urls_as_links");