diff src/gtkimhtml.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 2ab2de8add8b
children 1cbe76d30e81
line wrap: on
line diff
--- 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';