X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=38f55ad42dd040b9a42123798b02a5bb49203ed8;hp=561ca9f12ac48c54b38479aa1812d3a89617f49b;hb=25883ee2440d813f0b8adaf1a030c43e2afc075e;hpb=d27a0a29347366d5421e7e796eca4655ef0d095a diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 561ca9f..38f55ad 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -391,7 +391,7 @@ modest_text_utils_remove_duplicate_addresses (const gchar *address_list) static void modest_text_utils_convert_buffer_to_html_start (GString *html, const gchar *data, gssize n) { - guint i; + guint i = 0; gboolean space_seen = FALSE; guint break_dist = 0; /* distance since last break point */ @@ -399,7 +399,7 @@ modest_text_utils_convert_buffer_to_html_start (GString *html, const gchar *data n = strlen (data); /* replace with special html chars where needed*/ - for (i = 0; i != n; ++i) { + while (i != n) { char kar = data[i]; if (space_seen && kar != ' ') { @@ -443,8 +443,25 @@ modest_text_utils_convert_buffer_to_html_start (GString *html, const gchar *data space_seen = TRUE; break; default: - g_string_append_c (html, kar); + /* Optimization to copy single ascii + * characters faster */ + if (kar > 31 && kar < 127) { + g_string_append_c (html, kar); + } else { + /* Important: copy full UTF-8 characters, + * don't copy them byte by byte */ + gunichar c = g_utf8_get_char_validated (data+i, -1); + if (c != (gunichar) -1 && c != (gunichar) -2) { + const gchar *copyfrom = data + i; + int len = g_utf8_next_char(copyfrom) - copyfrom; + g_string_append_len (html, copyfrom, len); + i += len - 1; + } else { + g_warning ("%s: non-UTF8 byte found, skipping", __FUNCTION__); + } + } } + i++; } } @@ -1651,3 +1668,37 @@ modest_text_utils_label_get_selection (GtkLabel *label) return g_strdup (""); } } + +static gboolean +_forward_search_image_char (gunichar ch, + gpointer userdata) +{ + return (ch == 0xFFFC); +} + +gboolean +modest_text_utils_buffer_selection_is_valid (GtkTextBuffer *buffer) +{ + gboolean result; + GtkTextIter start, end; + + g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), FALSE); + + result = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer)); + + /* check there are no images in selection */ + if (result) { + gtk_text_buffer_get_selection_bounds (buffer, &start, &end); + if (gtk_text_iter_get_char (&start)== 0xFFFC) + result = FALSE; + else { + gtk_text_iter_backward_char (&end); + if (gtk_text_iter_forward_find_char (&start, _forward_search_image_char, + NULL, &end)) + result = FALSE; + } + + } + + return result; +}