diff src/gtkimhtmltoolbar.c @ 11267:477e5cca8287

[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 <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Mon, 15 Aug 2005 04:15:22 +0000
parents a511b77a368b
children b33eccbc3a10
line wrap: on
line diff
--- 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, "<FONT COLOR>", "</FONT>"); */
 	}
 	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, "<FONT COLOR>", "</FONT>"); */
 	}
 	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)