Updating branch refs/heads/master to e49eff41725bc101542cacfed0bf2678363fe5f7 (commit) from 0b9e9c2802362545d08c7711797d0ac5b3f74504 (commit)
commit e49eff41725bc101542cacfed0bf2678363fe5f7 Author: Christian Dywan <christ...@twotoasts.de> Date: Mon May 31 20:48:28 2010 +0200 Render emoticons lazily only when needed postler/postler-content.vala | 51 ++++++++++++++++++++++++++++++----------- 1 files changed, 37 insertions(+), 14 deletions(-) diff --git a/postler/postler-content.vala b/postler/postler-content.vala index b45ed93..e145da5 100644 --- a/postler/postler-content.vala +++ b/postler/postler-content.vala @@ -114,6 +114,36 @@ public class Postler.Content : WebKit.WebView { { "~_^", "face-wink" }, { "^_~", "face-wink" } }; + + static bool evaluate_emoticon (GLib.MatchInfo match_info, + GLib.StringBuilder result, + void* user_data) { + EmoticonMapping emoticon = *(EmoticonMapping*)user_data; + Gdk.Pixbuf pixbuf = null; + try { + pixbuf = Gtk.IconTheme.get_for_screen ( + Gdk.Screen.get_default ()).load_icon (emoticon.icon_name, 1, 0); + } catch (GLib.Error error) { } + if (pixbuf == null) + true; + string buffer; + size_t buffer_size; + try { + if (!Gdk.pixbuf_save_to_buffer (pixbuf, out buffer, + out buffer_size, "png", null, null)) + return true; + } + catch (GLib.Error error) { + return true; + } + + string encoded = GLib.base64_encode (buffer, buffer_size); + string data_uri = "data:image/png;base64," + encoded; + result.append (" <img src=\"" + data_uri + "\" " + + "title=\"" + emoticon.token + "\"/>"); + return false; + } + const string[] link_formats = { "(https?:\\/\\/\\S+)", "([a-za-z0-9.\\...@[a-za-z0-9.\\-]+[a-za-z0-9.]+)" @@ -345,20 +375,13 @@ public class Postler.Content : WebKit.WebView { /* Emoticons */ foreach (var emoticon in emoticons) { - var pixbuf = Gtk.IconTheme.get_for_screen ( - get_screen ()).load_icon (emoticon.icon_name, 1, 0); - if (pixbuf == null) - continue; - string buffer; - size_t buffer_size; - if (!Gdk.pixbuf_save_to_buffer (pixbuf, out buffer, - out buffer_size, "png", null, null)) - continue; - string encoded = GLib.base64_encode (buffer, buffer_size); - string data_uri = "data:image/png;base64," + encoded; - body_chunk = body_chunk.replace (" " + emoticon.token, - "<img src=\"" + data_uri + "\" " + - "title=\"" + emoticon.token + "\"/>"); + try { + var escaped = GLib.Regex.escape_string (" " + emoticon.token); + var regex = new GLib.Regex (escaped); + body_chunk = regex.replace_eval (body_chunk, -1, 0, 0, + evaluate_emoticon, &emoticon); + } + catch (GLib.RegexError error) { } } load_string (""" _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits