[empathy] theme-adium: port to new coding styles



commit 254c6ef0192ee7bc70530987a5e359cb4a04148c
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Mon Jul 2 15:09:00 2012 +0200

    theme-adium: port to new coding styles
    
    Some part of this file was already using the new style so best to stay
    coherent.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=679255

 libempathy-gtk/empathy-theme-adium.c | 3219 ++++++++++++++++++----------------
 libempathy-gtk/empathy-theme-adium.h |   88 +-
 2 files changed, 1721 insertions(+), 1586 deletions(-)
---
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index f1aad6e..09a9d57 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -1,6 +1,5 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * Copyright (C) 2008-2009 Collabora Ltd.
+ * Copyright (C) 2008-2012 Collabora Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -52,1821 +51,1926 @@
 /* "Join" consecutive messages with timestamps within five minutes */
 #define MESSAGE_JOIN_PERIOD 5*60
 
-typedef struct {
-	EmpathyAdiumData     *data;
-	EmpathySmileyManager *smiley_manager;
-	EmpathyContact       *last_contact;
-	gint64                last_timestamp;
-	gboolean              last_is_backlog;
-	guint                 pages_loading;
-	/* Queue of QueuedItem*s containing an EmpathyMessage or string */
-	GQueue                message_queue;
-	/* Queue of guint32 of pending message id to remove unread
-	 * marker for when we lose focus. */
-	GQueue                acked_messages;
-	GtkWidget            *inspector_window;
-
-	GSettings            *gsettings_chat;
-	GSettings            *gsettings_desktop;
-
-	gboolean              has_focus;
-	gboolean              has_unread_message;
-	gboolean              allow_scrolling;
-	gchar                *variant;
-	gboolean              in_construction;
-	gboolean              show_avatars;
+typedef struct
+{
+  EmpathyAdiumData *data;
+  EmpathySmileyManager *smiley_manager;
+  EmpathyContact *last_contact;
+  gint64 last_timestamp;
+  gboolean last_is_backlog;
+  guint pages_loading;
+  /* Queue of QueuedItem*s containing an EmpathyMessage or string */
+  GQueue message_queue;
+  /* Queue of guint32 of pending message id to remove unread
+   * marker for when we lose focus. */
+  GQueue acked_messages;
+  GtkWidget *inspector_window;
+
+  GSettings *gsettings_chat;
+  GSettings *gsettings_desktop;
+
+  gboolean has_focus;
+  gboolean has_unread_message;
+  gboolean allow_scrolling;
+  gchar *variant;
+  gboolean in_construction;
+  gboolean show_avatars;
 } EmpathyThemeAdiumPriv;
 
-struct _EmpathyAdiumData {
-	gint  ref_count;
-	gchar *path;
-	gchar *basedir;
-	gchar *default_avatar_filename;
-	gchar *default_incoming_avatar_filename;
-	gchar *default_outgoing_avatar_filename;
-	GHashTable *info;
-	guint version;
-	gboolean custom_template;
-	/* gchar* -> gchar* both owned */
-	GHashTable *date_format_cache;
-
-	/* HTML bits */
-	const gchar *template_html;
-	const gchar *content_html;
-	const gchar *in_content_html;
-	const gchar *in_context_html;
-	const gchar *in_nextcontent_html;
-	const gchar *in_nextcontext_html;
-	const gchar *out_content_html;
-	const gchar *out_context_html;
-	const gchar *out_nextcontent_html;
-	const gchar *out_nextcontext_html;
-	const gchar *status_html;
-
-	/* Above html strings are pointers to strings stored in this array.
-	 * We do this because of fallbacks, some htmls could be pointing the
-	 * same string. */
-	GPtrArray *strings_to_free;
+struct _EmpathyAdiumData
+{
+  gint ref_count;
+  gchar *path;
+  gchar *basedir;
+  gchar *default_avatar_filename;
+  gchar *default_incoming_avatar_filename;
+  gchar *default_outgoing_avatar_filename;
+  GHashTable *info;
+  guint version;
+  gboolean custom_template;
+  /* gchar* -> gchar* both owned */
+  GHashTable *date_format_cache;
+
+  /* HTML bits */
+  const gchar *template_html;
+  const gchar *content_html;
+  const gchar *in_content_html;
+  const gchar *in_context_html;
+  const gchar *in_nextcontent_html;
+  const gchar *in_nextcontext_html;
+  const gchar *out_content_html;
+  const gchar *out_context_html;
+  const gchar *out_nextcontent_html;
+  const gchar *out_nextcontext_html;
+  const gchar *status_html;
+
+  /* Above html strings are pointers to strings stored in this array.
+   * We do this because of fallbacks, some htmls could be pointing the
+   * same string. */
+  GPtrArray *strings_to_free;
 };
 
 static void theme_adium_iface_init (EmpathyChatViewIface *iface);
-static gchar * adium_info_dup_path_for_variant (GHashTable *info, const gchar *variant);
 
-enum {
-	PROP_0,
-	PROP_ADIUM_DATA,
-	PROP_VARIANT,
+static gchar * adium_info_dup_path_for_variant (GHashTable *info,
+    const gchar *variant);
+
+enum
+{
+  PROP_0,
+  PROP_ADIUM_DATA,
+  PROP_VARIANT,
 };
 
 G_DEFINE_TYPE_WITH_CODE (EmpathyThemeAdium, empathy_theme_adium,
-			 WEBKIT_TYPE_WEB_VIEW,
-			 G_IMPLEMENT_INTERFACE (EMPATHY_TYPE_CHAT_VIEW,
-						theme_adium_iface_init));
-
-enum {
-	QUEUED_EVENT,
-	QUEUED_MESSAGE,
-	QUEUED_EDIT
+       WEBKIT_TYPE_WEB_VIEW,
+       G_IMPLEMENT_INTERFACE (EMPATHY_TYPE_CHAT_VIEW,
+            theme_adium_iface_init));
+
+enum
+{
+  QUEUED_EVENT,
+  QUEUED_MESSAGE,
+  QUEUED_EDIT
 };
 
-typedef struct {
-	guint type;
-	EmpathyMessage *msg;
-	char *str;
-	gboolean should_highlight;
+typedef struct
+{
+  guint type;
+  EmpathyMessage *msg;
+  char *str;
+  gboolean should_highlight;
 } QueuedItem;
 
 static QueuedItem *
 queue_item (GQueue *queue,
-	    guint type,
-	    EmpathyMessage *msg,
-	    const char *str,
-	    gboolean should_highlight)
+    guint type,
+    EmpathyMessage *msg,
+    const char *str,
+    gboolean should_highlight)
 {
-	QueuedItem *item = g_slice_new0 (QueuedItem);
+  QueuedItem *item = g_slice_new0 (QueuedItem);
 
-	item->type = type;
-	if (msg != NULL)
-		item->msg = g_object_ref (msg);
-	item->str = g_strdup (str);
-	item->should_highlight = should_highlight;
+  item->type = type;
+  if (msg != NULL)
+    item->msg = g_object_ref (msg);
+  item->str = g_strdup (str);
+  item->should_highlight = should_highlight;
 
-	g_queue_push_tail (queue, item);
+  g_queue_push_tail (queue, item);
 
-	return item;
+  return item;
 }
 
 static void
 free_queued_item (QueuedItem *item)
 {
-	tp_clear_object (&item->msg);
-	g_free (item->str);
+  tp_clear_object (&item->msg);
+  g_free (item->str);
 
-	g_slice_free (QueuedItem, item);
+  g_slice_free (QueuedItem, item);
 }
 
 static void
 theme_adium_update_enable_webkit_developer_tools (EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	WebKitWebView  *web_view = WEBKIT_WEB_VIEW (theme);
-	gboolean        enable_webkit_developer_tools;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  WebKitWebView *web_view = WEBKIT_WEB_VIEW (theme);
+  gboolean enable_webkit_developer_tools;
 
-	enable_webkit_developer_tools = g_settings_get_boolean (
-			priv->gsettings_chat,
-			EMPATHY_PREFS_CHAT_WEBKIT_DEVELOPER_TOOLS);
+  enable_webkit_developer_tools = g_settings_get_boolean (
+      priv->gsettings_chat,
+      EMPATHY_PREFS_CHAT_WEBKIT_DEVELOPER_TOOLS);
 
-	g_object_set (G_OBJECT (webkit_web_view_get_settings (web_view)),
-		      "enable-developer-extras",
-		      enable_webkit_developer_tools,
-		      NULL);
+  g_object_set (G_OBJECT (webkit_web_view_get_settings (web_view)),
+      "enable-developer-extras", enable_webkit_developer_tools, NULL);
 }
 
 static void
-theme_adium_notify_enable_webkit_developer_tools_cb (GSettings   *gsettings,
-						     const gchar *key,
-						     gpointer     user_data)
+theme_adium_notify_enable_webkit_developer_tools_cb (GSettings *gsettings,
+    const gchar *key,
+    gpointer user_data)
 {
-	EmpathyThemeAdium  *theme = user_data;
+  EmpathyThemeAdium *theme = user_data;
 
-	theme_adium_update_enable_webkit_developer_tools (theme);
+  theme_adium_update_enable_webkit_developer_tools (theme);
 }
 
 static gboolean
-theme_adium_navigation_policy_decision_requested_cb (WebKitWebView             *view,
-						     WebKitWebFrame            *web_frame,
-						     WebKitNetworkRequest      *request,
-						     WebKitWebNavigationAction *action,
-						     WebKitWebPolicyDecision   *decision,
-						     gpointer                   data)
-{
-	const gchar *uri;
-
-	/* Only call url_show on clicks */
-	if (webkit_web_navigation_action_get_reason (action) !=
-	    WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
-		webkit_web_policy_decision_use (decision);
-		return TRUE;
-	}
+theme_adium_navigation_policy_decision_requested_cb (WebKitWebView *view,
+    WebKitWebFrame *web_frame,
+    WebKitNetworkRequest *request,
+    WebKitWebNavigationAction *action,
+    WebKitWebPolicyDecision *decision,
+    gpointer data)
+{
+  const gchar *uri;
+
+  /* Only call url_show on clicks */
+  if (webkit_web_navigation_action_get_reason (action) !=
+      WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED)
+    {
+      webkit_web_policy_decision_use (decision);
+      return TRUE;
+    }
 
-	uri = webkit_network_request_get_uri (request);
-	empathy_url_show (GTK_WIDGET (view), uri);
+  uri = webkit_network_request_get_uri (request);
+  empathy_url_show (GTK_WIDGET (view), uri);
 
-	webkit_web_policy_decision_ignore (decision);
-	return TRUE;
+  webkit_web_policy_decision_ignore (decision);
+  return TRUE;
 }
 
 /* Replace each %@ in format with string passed in args */
 static gchar *
 string_with_format (const gchar *format,
-		    const gchar *first_string,
-		    ...)
+    const gchar *first_string,
+    ...)
 {
-	va_list args;
-	const gchar *str;
-	GString *result;
+  va_list args;
+  const gchar *str;
+  GString *result;
 
-	va_start (args, first_string);
-	result = g_string_sized_new (strlen (format));
-	for (str = first_string; str != NULL; str = va_arg (args, const gchar *)) {
-		const gchar *next;
+  va_start (args, first_string);
+  result = g_string_sized_new (strlen (format));
+  for (str = first_string; str != NULL; str = va_arg (args, const gchar *))
+    {
+      const gchar *next;
 
-		next = strstr (format, "%@");
-		if (next == NULL) {
-			break;
-		}
+      next = strstr (format, "%@");
+      if (next == NULL)
+        break;
 
-		g_string_append_len (result, format, next - format);
-		g_string_append (result, str);
-		format = next + 2;
-	}
-	g_string_append (result, format);
-	va_end (args);
+      g_string_append_len (result, format, next - format);
+      g_string_append (result, str);
+      format = next + 2;
+    }
+  g_string_append (result, format);
+  va_end (args);
 
-	return g_string_free (result, FALSE);
+  return g_string_free (result, FALSE);
 }
 
 static void
 theme_adium_load_template (EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	gchar                 *basedir_uri;
-	gchar                 *variant_path;
-	gchar                 *template;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  gchar *basedir_uri;
+  gchar *variant_path;
+  gchar *template;
+
+  priv->pages_loading++;
+  basedir_uri = g_strconcat ("file://", priv->data->basedir, NULL);
 
-	priv->pages_loading++;
-	basedir_uri = g_strconcat ("file://", priv->data->basedir, NULL);
-	variant_path = adium_info_dup_path_for_variant (priv->data->info,
-		priv->variant);
-	template = string_with_format (priv->data->template_html,
-		variant_path, NULL);
-	webkit_web_view_load_html_string (WEBKIT_WEB_VIEW (theme),
-					  template, basedir_uri);
-	g_free (basedir_uri);
-	g_free (variant_path);
-	g_free (template);
+  variant_path = adium_info_dup_path_for_variant (priv->data->info,
+      priv->variant);
+
+  template = string_with_format (priv->data->template_html,
+    variant_path, NULL);
+
+  webkit_web_view_load_html_string (WEBKIT_WEB_VIEW (theme),
+      template, basedir_uri);
+
+  g_free (basedir_uri);
+  g_free (variant_path);
+  g_free (template);
 }
 
 static gchar *
 theme_adium_parse_body (EmpathyThemeAdium *self,
-	const gchar *text,
-	const gchar *token)
+  const gchar *text,
+  const gchar *token)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (self);
-	EmpathyStringParser *parsers;
-	GString *string;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (self);
+  EmpathyStringParser *parsers;
+  GString *string;
 
-	/* Check if we have to parse smileys */
-	parsers = empathy_webkit_get_string_parser (
-		g_settings_get_boolean (priv->gsettings_chat,
-			EMPATHY_PREFS_CHAT_SHOW_SMILEYS));
+  /* Check if we have to parse smileys */
+  parsers = empathy_webkit_get_string_parser (
+    g_settings_get_boolean (priv->gsettings_chat,
+      EMPATHY_PREFS_CHAT_SHOW_SMILEYS));
 
-	/* Parse text and construct string with links and smileys replaced
-	 * by html tags. Also escape text to make sure html code is
-	 * displayed verbatim. */
-	string = g_string_sized_new (strlen (text));
+  /* Parse text and construct string with links and smileys replaced
+   * by html tags. Also escape text to make sure html code is
+   * displayed verbatim. */
+  string = g_string_sized_new (strlen (text));
 
-	/* wrap this in HTML that allows us to find the message for later
-	 * editing */
-	if (!tp_str_empty (token))
-		g_string_append_printf (string,
-			"<span id=\"message-token-%s\">",
-			token);
+  /* wrap this in HTML that allows us to find the message for later
+   * editing */
+  if (!tp_str_empty (token))
+    g_string_append_printf (string,
+      "<span id=\"message-token-%s\">",
+      token);
 
-	empathy_string_parser_substr (text, -1, parsers, string);
+  empathy_string_parser_substr (text, -1, parsers, string);
 
-	if (!tp_str_empty (token))
-		g_string_append (string, "</span>");
+  if (!tp_str_empty (token))
+    g_string_append (string, "</span>");
 
-	/* Wrap body in order to make tabs and multiple spaces displayed
-	 * properly. See bug #625745. */
-	g_string_prepend (string, "<div style=\"display: inline; "
-					       "white-space: pre-wrap\"'>");
-	g_string_append (string, "</div>");
+  /* Wrap body in order to make tabs and multiple spaces displayed
+   * properly. See bug #625745. */
+  g_string_prepend (string, "<div style=\"display: inline; "
+                 "white-space: pre-wrap\"'>");
+  g_string_append (string, "</div>");
 
-	return g_string_free (string, FALSE);
+  return g_string_free (string, FALSE);
 }
 
 static void
 escape_and_append_len (GString *string, const gchar *str, gint len)
 {
-	while (str != NULL && *str != '\0' && len != 0) {
-		switch (*str) {
-		case '\\':
-			/* \ becomes \\ */
-			g_string_append (string, "\\\\");
-			break;
-		case '\"':
-			/* " becomes \" */
-			g_string_append (string, "\\\"");
-			break;
-		case '\n':
-			/* Remove end of lines */
-			break;
-		default:
-			g_string_append_c (string, *str);
-		}
-
-		str++;
-		len--;
-	}
+  while (str != NULL && *str != '\0' && len != 0)
+    {
+      switch (*str)
+        {
+          case '\\':
+            /* \ becomes \\ */
+            g_string_append (string, "\\\\");
+            break;
+          case '\"':
+            /* " becomes \" */
+            g_string_append (string, "\\\"");
+            break;
+          case '\n':
+            /* Remove end of lines */
+            break;
+          default:
+            g_string_append_c (string, *str);
+        }
+
+      str++;
+      len--;
+    }
 }
 
 /* If *str starts with match, returns TRUE and move pointer to the end */
 static gboolean
 theme_adium_match (const gchar **str,
-		   const gchar *match)
+    const gchar *match)
 {
-	gint len;
+  gint len;
 
-	len = strlen (match);
-	if (strncmp (*str, match, len) == 0) {
-		*str += len - 1;
-		return TRUE;
-	}
+  len = strlen (match);
+  if (strncmp (*str, match, len) == 0)
+    {
+      *str += len - 1;
+      return TRUE;
+    }
 
-	return FALSE;
+  return FALSE;
 }
 
-/* Like theme_adium_match() but also return the X part if match is like %foo{X}% */
+/* Like theme_adium_match() but also return the X part if match is
+ * like %foo{X}% */
 static gboolean
 theme_adium_match_with_format (const gchar **str,
-			       const gchar *match,
-			       gchar **format)
+    const gchar *match,
+    gchar **format)
 {
-	const gchar *cur = *str;
-	const gchar *end;
+  const gchar *cur = *str;
+  const gchar *end;
+
+  if (!theme_adium_match (&cur, match))
+    return FALSE;
 
-	if (!theme_adium_match (&cur, match)) {
-		return FALSE;
-	}
-	cur++;
+  cur++;
 
-	end = strstr (cur, "}%");
-	if (!end) {
-		return FALSE;
-	}
+  end = strstr (cur, "}%");
+  if (!end)
+    return FALSE;
 
-	*format = g_strndup (cur , end - cur);
-	*str = end + 1;
-	return TRUE;
+  *format = g_strndup (cur , end - cur);
+  *str = end + 1;
+  return TRUE;
 }
 
 /* List of colors used by %senderColor%. Copied from
  * adium/Frameworks/AIUtilities\ Framework/Source/AIColorAdditions.m
  */
 static gchar *colors[] = {
-	"aqua", "aquamarine", "blue", "blueviolet", "brown", "burlywood", "cadetblue",
-	"chartreuse", "chocolate", "coral", "cornflowerblue", "crimson", "cyan",
-	"darkblue", "darkcyan", "darkgoldenrod", "darkgreen", "darkgrey", "darkkhaki",
-	"darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred",
-	"darksalmon", "darkseagreen", "darkslateblue", "darkslategrey",
-	"darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgrey",
-	"dodgerblue", "firebrick", "forestgreen", "fuchsia", "gold", "goldenrod",
-	"green", "greenyellow", "grey", "hotpink", "indianred", "indigo", "lawngreen",
-	"lightblue", "lightcoral",
-	"lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen",
-	"lightskyblue", "lightslategrey", "lightsteelblue", "lime", "limegreen",
-	"magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid",
-	"mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen",
-	"mediumturquoise", "mediumvioletred", "midnightblue", "navy", "olive",
-	"olivedrab", "orange", "orangered", "orchid", "palegreen", "paleturquoise",
-	"palevioletred", "peru", "pink", "plum", "powderblue", "purple", "red",
-	"rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen",
-	"sienna", "silver", "skyblue", "slateblue", "slategrey", "springgreen",
-	"steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet",
-	"yellowgreen",
+  "aqua", "aquamarine", "blue", "blueviolet", "brown", "burlywood", "cadetblue",
+  "chartreuse", "chocolate", "coral", "cornflowerblue", "crimson", "cyan",
+  "darkblue", "darkcyan", "darkgoldenrod", "darkgreen", "darkgrey", "darkkhaki",
+  "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred",
+  "darksalmon", "darkseagreen", "darkslateblue", "darkslategrey",
+  "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgrey",
+  "dodgerblue", "firebrick", "forestgreen", "fuchsia", "gold", "goldenrod",
+  "green", "greenyellow", "grey", "hotpink", "indianred", "indigo", "lawngreen",
+  "lightblue", "lightcoral",
+  "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen",
+  "lightskyblue", "lightslategrey", "lightsteelblue", "lime", "limegreen",
+  "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid",
+  "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen",
+  "mediumturquoise", "mediumvioletred", "midnightblue", "navy", "olive",
+  "olivedrab", "orange", "orangered", "orchid", "palegreen", "paleturquoise",
+  "palevioletred", "peru", "pink", "plum", "powderblue", "purple", "red",
+  "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen",
+  "sienna", "silver", "skyblue", "slateblue", "slategrey", "springgreen",
+  "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet",
+  "yellowgreen",
 };
 
 static const gchar *
 nsdate_to_strftime (EmpathyAdiumData *data, const gchar *nsdate)
 {
-	/* Convert from NSDateFormatter (http://www.stepcase.com/blog/2008/12/02/format-string-for-the-iphone-nsdateformatter/)
-	 * to strftime supported by g_date_time_format.
-	 * FIXME: table is incomplete, doc of g_date_time_format has a table of
-	 *        supported tags.
-	 * FIXME: g_date_time_format in GLib 2.28 does 0 padding by default, but
-	 *        in 2.29.x we have to explictely request padding with %0x */
-	static const gchar *convert_table[] = {
-		"a", "%p", // AM/PM
-		"A", NULL, // 0~86399999 (Millisecond of Day)
-
-		"cccc", "%A", // Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
-		"ccc", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
-		"cc", "%u", // 1~7 (Day of Week)
-		"c", "%u", // 1~7 (Day of Week)
-
-		"dd", "%d", // 1~31 (0 padded Day of Month)
-		"d", "%d", // 1~31 (0 padded Day of Month)
-		"D", "%j", // 1~366 (0 padded Day of Year)
-
-		"e", "%u", // 1~7 (0 padded Day of Week)
-		"EEEE", "%A", // Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
-		"EEE", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
-		"EE", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
-		"E", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
-
-		"F", NULL, // 1~5 (0 padded Week of Month, first day of week = Monday)
-
-		"g", NULL, // Julian Day Number (number of days since 4713 BC January 1)
-		"GGGG", NULL, // Before Christ/Anno Domini
-		"GGG", NULL, // BC/AD (Era Designator Abbreviated)
-		"GG", NULL, // BC/AD (Era Designator Abbreviated)
-		"G", NULL, // BC/AD (Era Designator Abbreviated)
-
-		"h", "%I", // 1~12 (0 padded Hour (12hr))
-		"H", "%H", // 0~23 (0 padded Hour (24hr))
-
-		"k", NULL, // 1~24 (0 padded Hour (24hr)
-		"K", NULL, // 0~11 (0 padded Hour (12hr))
-
-		"LLLL", "%B", // January/February/March/April/May/June/July/August/September/October/November/December
-		"LLL", "%b", // Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
-		"LL", "%m", // 1~12 (0 padded Month)
-		"L", "%m", // 1~12 (0 padded Month)
-
-		"m", "%M", // 0~59 (0 padded Minute)
-		"MMMM", "%B", // January/February/March/April/May/June/July/August/September/October/November/December
-		"MMM", "%b", // Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
-		"MM", "%m", // 1~12 (0 padded Month)
-		"M", "%m", // 1~12 (0 padded Month)
-
-		"qqqq", NULL, // 1st quarter/2nd quarter/3rd quarter/4th quarter
-		"qqq", NULL, // Q1/Q2/Q3/Q4
-		"qq", NULL, // 1~4 (0 padded Quarter)
-		"q", NULL, // 1~4 (0 padded Quarter)
-		"QQQQ", NULL, // 1st quarter/2nd quarter/3rd quarter/4th quarter
-		"QQQ", NULL, // Q1/Q2/Q3/Q4
-		"QQ", NULL, // 1~4 (0 padded Quarter)
-		"Q", NULL, // 1~4 (0 padded Quarter)
-
-		"s", "%S", // 0~59 (0 padded Second)
-		"S", NULL, // (rounded Sub-Second)
-
-		"u", "%Y", // (0 padded Year)
-
-		"vvvv", "%Z", // (General GMT Timezone Name)
-		"vvv", "%Z", // (General GMT Timezone Abbreviation)
-		"vv", "%Z", // (General GMT Timezone Abbreviation)
-		"v", "%Z", // (General GMT Timezone Abbreviation)
-
-		"w", "%W", // 1~53 (0 padded Week of Year, 1st day of week = Sunday, NB, 1st week of year starts from the last Sunday of last year)
-		"W", NULL, // 1~5 (0 padded Week of Month, 1st day of week = Sunday)
-
-		"yyyy", "%Y", // (Full Year)
-		"yyy", "%y", // (2 Digits Year)
-		"yy", "%y", // (2 Digits Year)
-		"y", "%Y", // (Full Year)
-		"YYYY", NULL, // (Full Year, starting from the Sunday of the 1st week of year)
-		"YYY", NULL, // (2 Digits Year, starting from the Sunday of the 1st week of year)
-		"YY", NULL, // (2 Digits Year, starting from the Sunday of the 1st week of year)
-		"Y", NULL, // (Full Year, starting from the Sunday of the 1st week of year)
-
-		"zzzz", NULL, // (Specific GMT Timezone Name)
-		"zzz", NULL, // (Specific GMT Timezone Abbreviation)
-		"zz", NULL, // (Specific GMT Timezone Abbreviation)
-		"z", NULL, // (Specific GMT Timezone Abbreviation)
-		"Z", "%z", // +0000 (RFC 822 Timezone)
-	};
-	const gchar *str;
-	GString *string;
-	guint i, j;
-
-	if (nsdate == NULL) {
-		return NULL;
-	}
-
-	str = g_hash_table_lookup (data->date_format_cache, nsdate);
-	if (str != NULL) {
-		return str;
-	}
-
-	/* Copy nsdate into string, replacing occurences of NSDateFormatter tags
-	 * by corresponding strftime tag. */
-	string = g_string_sized_new (strlen (nsdate));
-	for (i = 0; nsdate[i] != '\0'; i++) {
-		gboolean found = FALSE;
-
-		/* even indexes are NSDateFormatter tag, odd indexes are the
-		 * corresponding strftime tag */
-		for (j = 0; j < G_N_ELEMENTS (convert_table); j += 2) {
-			if (g_str_has_prefix (nsdate + i, convert_table[j])) {
-				found = TRUE;
-				break;
-			}
-		}
-		if (found) {
-			/* If we don't have a replacement, just ignore that tag */
-			if (convert_table[j + 1] != NULL) {
-				g_string_append (string, convert_table[j + 1]);
-			}
-			i += strlen (convert_table[j]) - 1;
-		} else {
-			g_string_append_c (string, nsdate[i]);
-		}
-	}
-
-	DEBUG ("Date format converted '%s' â '%s'", nsdate, string->str);
-
-	/* The cache takes ownership of string->str */
-	g_hash_table_insert (data->date_format_cache, g_strdup (nsdate), string->str);
-	return g_string_free (string, FALSE);
+  /* Convert from NSDateFormatter
+   * (http://www.stepcase.com/blog/2008/12/02/format-string-for-the-iphone-nsdateformatter/)
+   * to strftime supported by g_date_time_format.
+   * FIXME: table is incomplete, doc of g_date_time_format has a table of
+   *        supported tags.
+   * FIXME: g_date_time_format in GLib 2.28 does 0 padding by default, but
+   *        in 2.29.x we have to explictely request padding with %0x */
+  static const gchar *convert_table[] = {
+    "a", "%p", // AM/PM
+    "A", NULL, // 0~86399999 (Millisecond of Day)
+
+    "cccc", "%A", // Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
+    "ccc", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
+    "cc", "%u", // 1~7 (Day of Week)
+    "c", "%u", // 1~7 (Day of Week)
+
+    "dd", "%d", // 1~31 (0 padded Day of Month)
+    "d", "%d", // 1~31 (0 padded Day of Month)
+    "D", "%j", // 1~366 (0 padded Day of Year)
+
+    "e", "%u", // 1~7 (0 padded Day of Week)
+    "EEEE", "%A", // Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
+    "EEE", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
+    "EE", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
+    "E", "%a", // Sun/Mon/Tue/Wed/Thu/Fri/Sat
+
+    "F", NULL, // 1~5 (0 padded Week of Month, first day of week = Monday)
+
+    "g", NULL, // Julian Day Number (number of days since 4713 BC January 1)
+    "GGGG", NULL, // Before Christ/Anno Domini
+    "GGG", NULL, // BC/AD (Era Designator Abbreviated)
+    "GG", NULL, // BC/AD (Era Designator Abbreviated)
+    "G", NULL, // BC/AD (Era Designator Abbreviated)
+
+    "h", "%I", // 1~12 (0 padded Hour (12hr))
+    "H", "%H", // 0~23 (0 padded Hour (24hr))
+
+    "k", NULL, // 1~24 (0 padded Hour (24hr)
+    "K", NULL, // 0~11 (0 padded Hour (12hr))
+
+    "LLLL", "%B", // January/February/March/April/May/June/July/August/September/October/November/December
+    "LLL", "%b", // Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
+    "LL", "%m", // 1~12 (0 padded Month)
+    "L", "%m", // 1~12 (0 padded Month)
+
+    "m", "%M", // 0~59 (0 padded Minute)
+    "MMMM", "%B", // January/February/March/April/May/June/July/August/September/October/November/December
+    "MMM", "%b", // Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
+    "MM", "%m", // 1~12 (0 padded Month)
+    "M", "%m", // 1~12 (0 padded Month)
+
+    "qqqq", NULL, // 1st quarter/2nd quarter/3rd quarter/4th quarter
+    "qqq", NULL, // Q1/Q2/Q3/Q4
+    "qq", NULL, // 1~4 (0 padded Quarter)
+    "q", NULL, // 1~4 (0 padded Quarter)
+    "QQQQ", NULL, // 1st quarter/2nd quarter/3rd quarter/4th quarter
+    "QQQ", NULL, // Q1/Q2/Q3/Q4
+    "QQ", NULL, // 1~4 (0 padded Quarter)
+    "Q", NULL, // 1~4 (0 padded Quarter)
+
+    "s", "%S", // 0~59 (0 padded Second)
+    "S", NULL, // (rounded Sub-Second)
+
+    "u", "%Y", // (0 padded Year)
+
+    "vvvv", "%Z", // (General GMT Timezone Name)
+    "vvv", "%Z", // (General GMT Timezone Abbreviation)
+    "vv", "%Z", // (General GMT Timezone Abbreviation)
+    "v", "%Z", // (General GMT Timezone Abbreviation)
+
+    "w", "%W", // 1~53 (0 padded Week of Year, 1st day of week = Sunday, NB, 1st week of year starts from the last Sunday of last year)
+    "W", NULL, // 1~5 (0 padded Week of Month, 1st day of week = Sunday)
+
+    "yyyy", "%Y", // (Full Year)
+    "yyy", "%y", // (2 Digits Year)
+    "yy", "%y", // (2 Digits Year)
+    "y", "%Y", // (Full Year)
+    "YYYY", NULL, // (Full Year, starting from the Sunday of the 1st week of year)
+    "YYY", NULL, // (2 Digits Year, starting from the Sunday of the 1st week of year)
+    "YY", NULL, // (2 Digits Year, starting from the Sunday of the 1st week of year)
+    "Y", NULL, // (Full Year, starting from the Sunday of the 1st week of year)
+
+    "zzzz", NULL, // (Specific GMT Timezone Name)
+    "zzz", NULL, // (Specific GMT Timezone Abbreviation)
+    "zz", NULL, // (Specific GMT Timezone Abbreviation)
+    "z", NULL, // (Specific GMT Timezone Abbreviation)
+    "Z", "%z", // +0000 (RFC 822 Timezone)
+  };
+  const gchar *str;
+  GString *string;
+  guint i, j;
+
+  if (nsdate == NULL)
+    return NULL;
+
+  str = g_hash_table_lookup (data->date_format_cache, nsdate);
+  if (str != NULL) {
+    return str;
+  }
+
+  /* Copy nsdate into string, replacing occurences of NSDateFormatter tags
+   * by corresponding strftime tag. */
+  string = g_string_sized_new (strlen (nsdate));
+  for (i = 0; nsdate[i] != '\0'; i++)
+    {
+      gboolean found = FALSE;
+
+      /* even indexes are NSDateFormatter tag, odd indexes are the
+       * corresponding strftime tag */
+      for (j = 0; j < G_N_ELEMENTS (convert_table); j += 2)
+        {
+          if (g_str_has_prefix (nsdate + i, convert_table[j]))
+            {
+              found = TRUE;
+              break;
+            }
+        }
+
+      if (found)
+        {
+          /* If we don't have a replacement, just ignore that tag */
+          if (convert_table[j + 1] != NULL)
+            g_string_append (string, convert_table[j + 1]);
+
+          i += strlen (convert_table[j]) - 1;
+        }
+      else
+        {
+          g_string_append_c (string, nsdate[i]);
+        }
+    }
+
+  DEBUG ("Date format converted '%s' â '%s'", nsdate, string->str);
+
+  /* The cache takes ownership of string->str */
+  g_hash_table_insert (data->date_format_cache, g_strdup (nsdate), string->str);
+  return g_string_free (string, FALSE);
 }
 
 
 static void
 theme_adium_append_html (EmpathyThemeAdium *theme,
-			 const gchar       *func,
-			 const gchar       *html,
-		         const gchar       *message,
-		         const gchar       *avatar_filename,
-		         const gchar       *name,
-		         const gchar       *contact_id,
-		         const gchar       *service_name,
-		         const gchar       *message_classes,
-		         gint64             timestamp,
-		         gboolean           is_backlog,
-		         gboolean           outgoing)
-{
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	GString     *string;
-	const gchar *cur = NULL;
-	gchar       *script;
-
-	/* Make some search-and-replace in the html code */
-	string = g_string_sized_new (strlen (html) + strlen (message));
-	g_string_append_printf (string, "%s(\"", func);
-	for (cur = html; *cur != '\0'; cur++) {
-		const gchar *replace = NULL;
-		gchar       *dup_replace = NULL;
-		gchar       *format = NULL;
-
-		/* Those are all well known keywords that needs replacement in
-		 * html files. Please keep them in the same order than the adium
-		 * spec. See http://trac.adium.im/wiki/CreatingMessageStyles */
-		if (theme_adium_match (&cur, "%userIconPath%")) {
-			replace = avatar_filename;
-		} else if (theme_adium_match (&cur, "%senderScreenName%")) {
-			replace = contact_id;
-		} else if (theme_adium_match (&cur, "%sender%")) {
-			replace = name;
-		} else if (theme_adium_match (&cur, "%senderColor%")) {
-			/* A color derived from the user's name.
-			 * FIXME: If a colon separated list of HTML colors is at
-			 * Incoming/SenderColors.txt it will be used instead of
-			 * the default colors.
-			 */
-
-			/* Ensure we always use the same color when sending messages
-			 * (bgo #658821) */
-			if (outgoing) {
-				replace = "inherit";
-			} else if (contact_id != NULL) {
-				guint hash = g_str_hash (contact_id);
-				replace = colors[hash % G_N_ELEMENTS (colors)];
-			}
-		} else if (theme_adium_match (&cur, "%senderStatusIcon%")) {
-			/* FIXME: The path to the status icon of the sender
-			 * (available, away, etc...)
-			 */
-		} else if (theme_adium_match (&cur, "%messageDirection%")) {
-			/* FIXME: The text direction of the message
-			 * (either rtl or ltr)
-			 */
-		} else if (theme_adium_match (&cur, "%senderDisplayName%")) {
-			/* FIXME: The serverside (remotely set) name of the
-			 * sender, such as an MSN display name.
-			 *
-			 *  We don't have access to that yet so we use
-			 * local alias instead.
-			 */
-			replace = name;
-		} else if (theme_adium_match (&cur, "%senderPrefix%")) {
-			/* FIXME: If we supported IRC user mode flags, this
-			 * would be replaced with @ if the user is an op, + if
-			 * the user has voice, etc. as per
-			 * http://hg.adium.im/adium/rev/b586b027de42. But we
-			 * don't, so for now we just strip it. */
-		} else if (theme_adium_match_with_format (&cur, "%textbackgroundcolor{", &format)) {
-			/* FIXME: This keyword is used to represent the
-			 * highlight background color. "X" is the opacity of the
-			 * background, ranges from 0 to 1 and can be any decimal
-			 * between.
-			 */
-		} else if (theme_adium_match (&cur, "%message%")) {
-			replace = message;
-		} else if (theme_adium_match (&cur, "%time%") ||
-			   theme_adium_match_with_format (&cur, "%time{", &format)) {
-			const gchar *strftime_format;
-
-			strftime_format = nsdate_to_strftime (priv->data, format);
-			if (is_backlog) {
-				dup_replace = empathy_time_to_string_local (timestamp,
-					strftime_format ? strftime_format :
-					EMPATHY_TIME_DATE_FORMAT_DISPLAY_SHORT);
-			} else {
-				dup_replace = empathy_time_to_string_local (timestamp,
-					strftime_format ? strftime_format :
-					EMPATHY_TIME_FORMAT_DISPLAY_SHORT);
-			}
-			replace = dup_replace;
-		} else if (theme_adium_match (&cur, "%shortTime%")) {
-			dup_replace = empathy_time_to_string_local (timestamp,
-				EMPATHY_TIME_FORMAT_DISPLAY_SHORT);
-			replace = dup_replace;
-		} else if (theme_adium_match (&cur, "%service%")) {
-			replace = service_name;
-		} else if (theme_adium_match (&cur, "%variant%")) {
-			/* FIXME: The name of the active message style variant,
-			 * with all spaces replaced with an underscore.
-			 * A variant named "Alternating Messages - Blue Red"
-			 * will become "Alternating_Messages_-_Blue_Red".
-			 */
-		} else if (theme_adium_match (&cur, "%userIcons%")) {
-			replace = priv->show_avatars ? "showIcons" : "hideIcons";
-		} else if (theme_adium_match (&cur, "%messageClasses%")) {
-			replace = message_classes;
-		} else if (theme_adium_match (&cur, "%status%")) {
-			/* FIXME: A description of the status event. This is
-			 * neither in the user's local language nor expected to
-			 * be displayed; it may be useful to use a different div
-			 * class to present different types of status messages.
-			 * The following is a list of some of the more important
-			 * status messages; your message style should be able to
-			 * handle being shown a status message not in this list,
-			 * as even at present the list is incomplete and is
-			 * certain to become out of date in the future:
-			 * 	online
-			 *	offline
-			 *	away
-			 *	away_message
-			 *	return_away
-			 *	idle
-			 *	return_idle
-			 *	date_separator
-			 *	contact_joined (group chats)
-			 *	contact_left
-			 *	error
-			 *	timed_out
-			 *	encryption (all OTR messages use this status)
-			 *	purple (all IRC topic and join/part messages use this status)
-			 *	fileTransferStarted
-			 *	fileTransferCompleted
-			 */
-		} else {
-			escape_and_append_len (string, cur, 1);
-			continue;
-		}
-
-		/* Here we have a replacement to make */
-		escape_and_append_len (string, replace, -1);
-
-		g_free (dup_replace);
-		g_free (format);
-	}
-	g_string_append (string, "\")");
-
-	script = g_string_free (string, FALSE);
-	webkit_web_view_execute_script (WEBKIT_WEB_VIEW (theme), script);
-	g_free (script);
+    const gchar *func,
+    const gchar *html,
+    const gchar *message,
+    const gchar *avatar_filename,
+    const gchar *name,
+    const gchar *contact_id,
+    const gchar *service_name,
+    const gchar *message_classes,
+    gint64 timestamp,
+    gboolean is_backlog,
+    gboolean outgoing)
+{
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  GString *string;
+  const gchar *cur = NULL;
+  gchar *script;
+
+  /* Make some search-and-replace in the html code */
+  string = g_string_sized_new (strlen (html) + strlen (message));
+  g_string_append_printf (string, "%s(\"", func);
+
+  for (cur = html; *cur != '\0'; cur++)
+    {
+      const gchar *replace = NULL;
+      gchar *dup_replace = NULL;
+      gchar *format = NULL;
+
+      /* Those are all well known keywords that needs replacement in
+       * html files. Please keep them in the same order than the adium
+       * spec. See http://trac.adium.im/wiki/CreatingMessageStyles */
+      if (theme_adium_match (&cur, "%userIconPath%"))
+        {
+          replace = avatar_filename;
+        }
+      else if (theme_adium_match (&cur, "%senderScreenName%"))
+        {
+          replace = contact_id;
+        }
+      else if (theme_adium_match (&cur, "%sender%"))
+        {
+          replace = name;
+        }
+      else if (theme_adium_match (&cur, "%senderColor%"))
+        {
+          /* A color derived from the user's name.
+           * FIXME: If a colon separated list of HTML colors is at
+           * Incoming/SenderColors.txt it will be used instead of
+           * the default colors.
+           */
+
+          /* Ensure we always use the same color when sending messages
+           * (bgo #658821) */
+          if (outgoing)
+            {
+              replace = "inherit";
+            }
+          else if (contact_id != NULL)
+            {
+              guint hash = g_str_hash (contact_id);
+              replace = colors[hash % G_N_ELEMENTS (colors)];
+            }
+        }
+      else if (theme_adium_match (&cur, "%senderStatusIcon%"))
+        {
+          /* FIXME: The path to the status icon of the sender
+           * (available, away, etc...)
+           */
+        }
+      else if (theme_adium_match (&cur, "%messageDirection%"))
+        {
+          /* FIXME: The text direction of the message
+           * (either rtl or ltr)
+           */
+        }
+      else if (theme_adium_match (&cur, "%senderDisplayName%"))
+        {
+          /* FIXME: The serverside (remotely set) name of the
+           * sender, such as an MSN display name.
+           *
+           *  We don't have access to that yet so we use
+           * local alias instead.
+           */
+          replace = name;
+        }
+      else if (theme_adium_match (&cur, "%senderPrefix%"))
+        {
+          /* FIXME: If we supported IRC user mode flags, this
+           * would be replaced with @ if the user is an op, + if
+           * the user has voice, etc. as per
+           * http://hg.adium.im/adium/rev/b586b027de42. But we
+           * don't, so for now we just strip it. */
+        }
+      else if (theme_adium_match_with_format (&cur, "%textbackgroundcolor{",
+            &format))
+        {
+          /* FIXME: This keyword is used to represent the
+           * highlight background color. "X" is the opacity of the
+           * background, ranges from 0 to 1 and can be any decimal
+           * between.
+           */
+        }
+      else if (theme_adium_match (&cur, "%message%"))
+        {
+          replace = message;
+        }
+      else if (theme_adium_match (&cur, "%time%") ||
+           theme_adium_match_with_format (&cur, "%time{", &format))
+        {
+          const gchar *strftime_format;
+
+          strftime_format = nsdate_to_strftime (priv->data, format);
+          if (is_backlog)
+            dup_replace = empathy_time_to_string_local (timestamp,
+              strftime_format ? strftime_format :
+              EMPATHY_TIME_DATE_FORMAT_DISPLAY_SHORT);
+          else
+            dup_replace = empathy_time_to_string_local (timestamp,
+              strftime_format ? strftime_format :
+              EMPATHY_TIME_FORMAT_DISPLAY_SHORT);
+
+          replace = dup_replace;
+        }
+      else if (theme_adium_match (&cur, "%shortTime%"))
+        {
+          dup_replace = empathy_time_to_string_local (timestamp,
+            EMPATHY_TIME_FORMAT_DISPLAY_SHORT);
+          replace = dup_replace;
+        }
+      else if (theme_adium_match (&cur, "%service%"))
+        {
+          replace = service_name;
+        }
+      else if (theme_adium_match (&cur, "%variant%"))
+        {
+          /* FIXME: The name of the active message style variant,
+           * with all spaces replaced with an underscore.
+           * A variant named "Alternating Messages - Blue Red"
+           * will become "Alternating_Messages_-_Blue_Red".
+           */
+        }
+      else if (theme_adium_match (&cur, "%userIcons%"))
+        {
+          replace = priv->show_avatars ? "showIcons" : "hideIcons";
+        }
+      else if (theme_adium_match (&cur, "%messageClasses%"))
+        {
+          replace = message_classes;
+        }
+      else if (theme_adium_match (&cur, "%status%"))
+        {
+          /* FIXME: A description of the status event. This is
+           * neither in the user's local language nor expected to
+           * be displayed; it may be useful to use a different div
+           * class to present different types of status messages.
+           * The following is a list of some of the more important
+           * status messages; your message style should be able to
+           * handle being shown a status message not in this list,
+           * as even at present the list is incomplete and is
+           * certain to become out of date in the future:
+           *  online
+           *  offline
+           *  away
+           *  away_message
+           *  return_away
+           *  idle
+           *  return_idle
+           *  date_separator
+           *  contact_joined (group chats)
+           *  contact_left
+           *  error
+           *  timed_out
+           *  encryption (all OTR messages use this status)
+           *  purple (all IRC topic and join/part messages use this status)
+           *  fileTransferStarted
+           *  fileTransferCompleted
+           */
+        }
+      else
+        {
+          escape_and_append_len (string, cur, 1);
+          continue;
+        }
+
+      /* Here we have a replacement to make */
+      escape_and_append_len (string, replace, -1);
+
+      g_free (dup_replace);
+      g_free (format);
+    }
+  g_string_append (string, "\")");
+
+  script = g_string_free (string, FALSE);
+  webkit_web_view_execute_script (WEBKIT_WEB_VIEW (theme), script);
+  g_free (script);
 }
 
 static void
 theme_adium_append_event_escaped (EmpathyChatView *view,
-				  const gchar     *escaped)
+    const gchar *escaped)
 {
-	EmpathyThemeAdium     *theme = EMPATHY_THEME_ADIUM (view);
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
 
-	theme_adium_append_html (theme, "appendMessage",
-				 priv->data->status_html, escaped, NULL, NULL, NULL,
-				 NULL, "event",
-				 empathy_time_get_current (), FALSE, FALSE);
+  theme_adium_append_html (theme, "appendMessage",
+      priv->data->status_html, escaped, NULL, NULL, NULL,
+      NULL, "event", empathy_time_get_current (), FALSE, FALSE);
 
-	/* There is no last contact */
-	if (priv->last_contact) {
-		g_object_unref (priv->last_contact);
-		priv->last_contact = NULL;
-	}
+  /* There is no last contact */
+  if (priv->last_contact)
+    {
+      g_object_unref (priv->last_contact);
+      priv->last_contact = NULL;
+    }
 }
 
 static void
 theme_adium_remove_focus_marks (EmpathyThemeAdium *theme,
     WebKitDOMNodeList *nodes)
 {
-	guint i;
-
-	/* Remove focus and firstFocus class */
-	for (i = 0; i < webkit_dom_node_list_get_length (nodes); i++) {
-		WebKitDOMNode *node = webkit_dom_node_list_item (nodes, i);
-		WebKitDOMHTMLElement *element = WEBKIT_DOM_HTML_ELEMENT (node);
-		gchar *class_name;
-		gchar **classes, **iter;
-		GString *new_class_name;
-		gboolean first = TRUE;
-
-		if (element == NULL) {
-			continue;
-		}
-
-		class_name = webkit_dom_html_element_get_class_name (element);
-		classes = g_strsplit (class_name, " ", -1);
-		new_class_name = g_string_sized_new (strlen (class_name));
-		for (iter = classes; *iter != NULL; iter++) {
-			if (tp_strdiff (*iter, "focus") &&
-			    tp_strdiff (*iter, "firstFocus")) {
-				if (!first) {
-					g_string_append_c (new_class_name, ' ');
-				}
-				g_string_append (new_class_name, *iter);
-				first = FALSE;
-			}
-		}
-
-		webkit_dom_html_element_set_class_name (element, new_class_name->str);
-
-		g_free (class_name);
-		g_strfreev (classes);
-		g_string_free (new_class_name, TRUE);
-	}
+  guint i;
+
+  /* Remove focus and firstFocus class */
+  for (i = 0; i < webkit_dom_node_list_get_length (nodes); i++)
+    {
+      WebKitDOMNode *node = webkit_dom_node_list_item (nodes, i);
+      WebKitDOMHTMLElement *element = WEBKIT_DOM_HTML_ELEMENT (node);
+      gchar *class_name;
+      gchar **classes, **iter;
+      GString *new_class_name;
+      gboolean first = TRUE;
+
+      if (element == NULL)
+        continue;
+
+      class_name = webkit_dom_html_element_get_class_name (element);
+      classes = g_strsplit (class_name, " ", -1);
+      new_class_name = g_string_sized_new (strlen (class_name));
+
+      for (iter = classes; *iter != NULL; iter++)
+        {
+          if (tp_strdiff (*iter, "focus") &&
+              tp_strdiff (*iter, "firstFocus"))
+            {
+              if (!first)
+                g_string_append_c (new_class_name, ' ');
+
+              g_string_append (new_class_name, *iter);
+              first = FALSE;
+            }
+        }
+
+      webkit_dom_html_element_set_class_name (element, new_class_name->str);
+
+      g_free (class_name);
+      g_strfreev (classes);
+      g_string_free (new_class_name, TRUE);
+    }
 }
 
 static void
 theme_adium_remove_all_focus_marks (EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	WebKitDOMDocument *dom;
-	WebKitDOMNodeList *nodes;
-	GError *error = NULL;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  WebKitDOMDocument *dom;
+  WebKitDOMNodeList *nodes;
+  GError *error = NULL;
 
-	if (!priv->has_unread_message)
-		return;
+  if (!priv->has_unread_message)
+    return;
 
-	priv->has_unread_message = FALSE;
+  priv->has_unread_message = FALSE;
 
-	dom = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (theme));
-	if (dom == NULL) {
-		return;
-	}
+  dom = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (theme));
+  if (dom == NULL)
+    return;
 
-	/* Get all nodes with focus class */
-	nodes = webkit_dom_document_query_selector_all (dom, ".focus", &error);
-	if (nodes == NULL) {
-		DEBUG ("Error getting focus nodes: %s",
-			error ? error->message : "No error");
-		g_clear_error (&error);
-		return;
-	}
+  /* Get all nodes with focus class */
+  nodes = webkit_dom_document_query_selector_all (dom, ".focus", &error);
+
+  if (nodes == NULL)
+    {
+      DEBUG ("Error getting focus nodes: %s",
+        error ? error->message : "No error");
+      g_clear_error (&error);
+      return;
+    }
 
-	theme_adium_remove_focus_marks (theme, nodes);
+  theme_adium_remove_focus_marks (theme, nodes);
 }
 
 static void
 theme_adium_append_message (EmpathyChatView *view,
-			    EmpathyMessage  *msg,
-			    gboolean         should_highlight)
-{
-	EmpathyThemeAdium     *theme = EMPATHY_THEME_ADIUM (view);
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	EmpathyContact        *sender;
-	TpMessage             *tp_msg;
-	TpAccount             *account;
-	gchar                 *body_escaped, *name_escaped;
-	const gchar           *name;
-	const gchar           *contact_id;
-	EmpathyAvatar         *avatar;
-	const gchar           *avatar_filename = NULL;
-	gint64                 timestamp;
-	const gchar           *html = NULL;
-	const gchar           *func;
-	const gchar           *service_name;
-	GString               *message_classes = NULL;
-	gboolean               is_backlog;
-	gboolean               consecutive;
-	gboolean               action;
-
-	if (priv->pages_loading != 0) {
-		queue_item (&priv->message_queue, QUEUED_MESSAGE, msg, NULL, should_highlight);
-		return;
-	}
-
-	/* Get information */
-	sender = empathy_message_get_sender (msg);
-	account = empathy_contact_get_account (sender);
-	service_name = empathy_protocol_name_to_display_name
-		(tp_account_get_protocol (account));
-	if (service_name == NULL)
-		service_name = tp_account_get_protocol (account);
-	timestamp = empathy_message_get_timestamp (msg);
-	body_escaped = theme_adium_parse_body (theme,
-		empathy_message_get_body (msg),
-		empathy_message_get_token (msg));
-	name = empathy_contact_get_logged_alias (sender);
-	contact_id = empathy_contact_get_id (sender);
-	action = (empathy_message_get_tptype (msg) == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION);
-
-	name_escaped = g_markup_escape_text (name, -1);
-
-	/* If this is a /me probably */
-	if (action) {
-		gchar *str;
-
-		if (priv->data->version >= 4 || !priv->data->custom_template) {
-			str = g_strdup_printf ("<span class='actionMessageUserName'>%s</span>"
-					       "<span class='actionMessageBody'>%s</span>",
-					       name_escaped, body_escaped);
-		} else {
-			str = g_strdup_printf ("*%s*", body_escaped);
-		}
-		g_free (body_escaped);
-		body_escaped = str;
-	}
-
-	/* Get the avatar filename, or a fallback */
-	avatar = empathy_contact_get_avatar (sender);
-	if (avatar) {
-		avatar_filename = avatar->filename;
-	}
-	if (!avatar_filename) {
-		if (empathy_contact_is_user (sender)) {
-			avatar_filename = priv->data->default_outgoing_avatar_filename;
-		} else {
-			avatar_filename = priv->data->default_incoming_avatar_filename;
-		}
-		if (!avatar_filename) {
-			if (!priv->data->default_avatar_filename) {
-				priv->data->default_avatar_filename =
-					empathy_filename_from_icon_name (EMPATHY_IMAGE_AVATAR_DEFAULT,
-									 GTK_ICON_SIZE_DIALOG);
-			}
-			avatar_filename = priv->data->default_avatar_filename;
-		}
-	}
-
-	/* We want to join this message with the last one if
-	 * - senders are the same contact,
-	 * - last message was recieved recently,
-	 * - last message and this message both are/aren't backlog, and
-	 * - DisableCombineConsecutive is not set in theme's settings */
-	is_backlog = empathy_message_is_backlog (msg);
-	consecutive = empathy_contact_equal (priv->last_contact, sender) &&
-		(timestamp - priv->last_timestamp < MESSAGE_JOIN_PERIOD) &&
-		(is_backlog == priv->last_is_backlog) &&
-		!tp_asv_get_boolean (priv->data->info,
-				     "DisableCombineConsecutive", NULL);
-
-	/* Define message classes */
-	message_classes = g_string_new ("message");
-	if (!priv->has_focus && !is_backlog) {
-		if (!priv->has_unread_message) {
-			g_string_append (message_classes, " firstFocus");
-			priv->has_unread_message = TRUE;
-		}
-		g_string_append (message_classes, " focus");
-	}
-	if (is_backlog) {
-		g_string_append (message_classes, " history");
-	}
-	if (consecutive) {
-		g_string_append (message_classes, " consecutive");
-	}
-	if (empathy_contact_is_user (sender)) {
-		g_string_append (message_classes, " outgoing");
-	} else {
-		g_string_append (message_classes, " incoming");
-	}
-	if (should_highlight) {
-		g_string_append (message_classes, " mention");
-	}
-	if (empathy_message_get_tptype (msg) == TP_CHANNEL_TEXT_MESSAGE_TYPE_AUTO_REPLY) {
-		g_string_append (message_classes, " autoreply");
-	}
-	if (action) {
-		g_string_append (message_classes, " action");
-	}
-	/* FIXME: other classes:
-	 * status - the message is a status change
-	 * event - the message is a notification of something happening
-	 *         (for example, encryption being turned on)
-	 * %status% - See %status% in theme_adium_append_html ()
-	 */
-
-	/* This is slightly a hack, but it's the only way to add
-	 * arbitrary data to messages in the HTML. We add another
-	 * class called "x-empathy-message-id-*" to the message. This
-	 * way, we can remove the unread marker for this specific
-	 * message later. */
-	tp_msg = empathy_message_get_tp_message (msg);
-	if (tp_msg != NULL) {
-		guint32 id;
-		gboolean valid;
-
-		id = tp_message_get_pending_message_id (tp_msg, &valid);
-		if (valid) {
-			g_string_append_printf (message_classes,
-			    " x-empathy-message-id-%u", id);
-		}
-	}
-
-	/* Define javascript function to use */
-	if (consecutive) {
-		func = priv->allow_scrolling ? "appendNextMessage" : "appendNextMessageNoScroll";
-	} else {
-		func = priv->allow_scrolling ? "appendMessage" : "appendMessageNoScroll";
-	}
-
-	if (empathy_contact_is_user (sender)) {
-		/* out */
-		if (is_backlog) {
-			/* context */
-			html = consecutive ? priv->data->out_nextcontext_html : priv->data->out_context_html;
-		} else {
-			/* content */
-			html = consecutive ? priv->data->out_nextcontent_html : priv->data->out_content_html;
-		}
-
-		/* remove all the unread marks when we are sending a message */
-		theme_adium_remove_all_focus_marks (theme);
-	} else {
-		/* in */
-		if (is_backlog) {
-			/* context */
-			html = consecutive ? priv->data->in_nextcontext_html : priv->data->in_context_html;
-		} else {
-			/* content */
-			html = consecutive ? priv->data->in_nextcontent_html : priv->data->in_content_html;
-		}
-	}
-
-	theme_adium_append_html (theme, func, html, body_escaped,
-				 avatar_filename, name_escaped, contact_id,
-				 service_name, message_classes->str,
-				 timestamp, is_backlog, empathy_contact_is_user (sender));
-
-	/* Keep the sender of the last displayed message */
-	if (priv->last_contact) {
-		g_object_unref (priv->last_contact);
-	}
-	priv->last_contact = g_object_ref (sender);
-	priv->last_timestamp = timestamp;
-	priv->last_is_backlog = is_backlog;
-
-	g_free (body_escaped);
-	g_free (name_escaped);
-	g_string_free (message_classes, TRUE);
+    EmpathyMessage *msg,
+    gboolean should_highlight)
+{
+  EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  EmpathyContact *sender;
+  TpMessage *tp_msg;
+  TpAccount *account;
+  gchar *body_escaped, *name_escaped;
+  const gchar *name;
+  const gchar *contact_id;
+  EmpathyAvatar *avatar;
+  const gchar *avatar_filename = NULL;
+  gint64 timestamp;
+  const gchar *html = NULL;
+  const gchar *func;
+  const gchar *service_name;
+  GString *message_classes = NULL;
+  gboolean is_backlog;
+  gboolean consecutive;
+  gboolean action;
+
+  if (priv->pages_loading != 0)
+    {
+      queue_item (&priv->message_queue, QUEUED_MESSAGE, msg, NULL,
+          should_highlight);
+      return;
+    }
+
+  /* Get information */
+  sender = empathy_message_get_sender (msg);
+  account = empathy_contact_get_account (sender);
+  service_name = empathy_protocol_name_to_display_name
+    (tp_account_get_protocol (account));
+  if (service_name == NULL)
+    service_name = tp_account_get_protocol (account);
+  timestamp = empathy_message_get_timestamp (msg);
+  body_escaped = theme_adium_parse_body (theme,
+    empathy_message_get_body (msg),
+    empathy_message_get_token (msg));
+  name = empathy_contact_get_logged_alias (sender);
+  contact_id = empathy_contact_get_id (sender);
+  action = (empathy_message_get_tptype (msg) ==
+      TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION);
+
+  name_escaped = g_markup_escape_text (name, -1);
+
+  /* If this is a /me probably */
+  if (action)
+    {
+      gchar *str;
+
+      if (priv->data->version >= 4 || !priv->data->custom_template)
+        {
+          str = g_strdup_printf ("<span class='actionMessageUserName'>%s</span>"
+                     "<span class='actionMessageBody'>%s</span>",
+                     name_escaped, body_escaped);
+        }
+      else
+        {
+          str = g_strdup_printf ("*%s*", body_escaped);
+        }
+
+      g_free (body_escaped);
+      body_escaped = str;
+    }
+
+  /* Get the avatar filename, or a fallback */
+  avatar = empathy_contact_get_avatar (sender);
+  if (avatar)
+    avatar_filename = avatar->filename;
+
+  if (!avatar_filename)
+    {
+      if (empathy_contact_is_user (sender))
+        avatar_filename = priv->data->default_outgoing_avatar_filename;
+      else
+        avatar_filename = priv->data->default_incoming_avatar_filename;
+
+      if (!avatar_filename)
+        {
+          if (!priv->data->default_avatar_filename)
+            priv->data->default_avatar_filename =
+              empathy_filename_from_icon_name (EMPATHY_IMAGE_AVATAR_DEFAULT,
+                       GTK_ICON_SIZE_DIALOG);
+
+          avatar_filename = priv->data->default_avatar_filename;
+        }
+    }
+
+  /* We want to join this message with the last one if
+   * - senders are the same contact,
+   * - last message was recieved recently,
+   * - last message and this message both are/aren't backlog, and
+   * - DisableCombineConsecutive is not set in theme's settings */
+  is_backlog = empathy_message_is_backlog (msg);
+  consecutive = empathy_contact_equal (priv->last_contact, sender) &&
+    (timestamp - priv->last_timestamp < MESSAGE_JOIN_PERIOD) &&
+    (is_backlog == priv->last_is_backlog) &&
+    !tp_asv_get_boolean (priv->data->info,
+             "DisableCombineConsecutive", NULL);
+
+  /* Define message classes */
+  message_classes = g_string_new ("message");
+  if (!priv->has_focus && !is_backlog)
+    {
+      if (!priv->has_unread_message)
+        {
+          g_string_append (message_classes, " firstFocus");
+          priv->has_unread_message = TRUE;
+        }
+      g_string_append (message_classes, " focus");
+    }
+
+  if (is_backlog)
+    g_string_append (message_classes, " history");
+
+  if (consecutive)
+    g_string_append (message_classes, " consecutive");
+
+  if (empathy_contact_is_user (sender))
+    g_string_append (message_classes, " outgoing");
+  else
+    g_string_append (message_classes, " incoming");
+
+  if (should_highlight)
+    g_string_append (message_classes, " mention");
+
+  if (empathy_message_get_tptype (msg) ==
+      TP_CHANNEL_TEXT_MESSAGE_TYPE_AUTO_REPLY)
+    g_string_append (message_classes, " autoreply");
+
+  if (action)
+    g_string_append (message_classes, " action");
+
+  /* FIXME: other classes:
+   * status - the message is a status change
+   * event - the message is a notification of something happening
+   *         (for example, encryption being turned on)
+   * %status% - See %status% in theme_adium_append_html ()
+   */
+
+  /* This is slightly a hack, but it's the only way to add
+   * arbitrary data to messages in the HTML. We add another
+   * class called "x-empathy-message-id-*" to the message. This
+   * way, we can remove the unread marker for this specific
+   * message later. */
+  tp_msg = empathy_message_get_tp_message (msg);
+  if (tp_msg != NULL)
+    {
+      guint32 id;
+      gboolean valid;
+
+      id = tp_message_get_pending_message_id (tp_msg, &valid);
+      if (valid)
+        g_string_append_printf (message_classes,
+            " x-empathy-message-id-%u", id);
+    }
+
+  /* Define javascript function to use */
+  if (consecutive)
+    func = priv->allow_scrolling ? "appendNextMessage" :
+      "appendNextMessageNoScroll";
+  else
+    func = priv->allow_scrolling ? "appendMessage" : "appendMessageNoScroll";
+
+  if (empathy_contact_is_user (sender))
+    {
+      /* out */
+      if (is_backlog)
+        /* context */
+        html = consecutive ? priv->data->out_nextcontext_html :
+          priv->data->out_context_html;
+      else
+        /* content */
+        html = consecutive ? priv->data->out_nextcontent_html :
+          priv->data->out_content_html;
+
+      /* remove all the unread marks when we are sending a message */
+      theme_adium_remove_all_focus_marks (theme);
+    }
+  else
+    {
+      /* in */
+      if (is_backlog)
+        /* context */
+        html = consecutive ? priv->data->in_nextcontext_html :
+          priv->data->in_context_html;
+      else
+        /* content */
+        html = consecutive ? priv->data->in_nextcontent_html :
+          priv->data->in_content_html;
+    }
+
+  theme_adium_append_html (theme, func, html, body_escaped,
+      avatar_filename, name_escaped, contact_id,
+      service_name, message_classes->str,
+      timestamp, is_backlog, empathy_contact_is_user (sender));
+
+  /* Keep the sender of the last displayed message */
+  if (priv->last_contact)
+    g_object_unref (priv->last_contact);
+
+  priv->last_contact = g_object_ref (sender);
+  priv->last_timestamp = timestamp;
+  priv->last_is_backlog = is_backlog;
+
+  g_free (body_escaped);
+  g_free (name_escaped);
+  g_string_free (message_classes, TRUE);
 }
 
 static void
 theme_adium_append_event (EmpathyChatView *view,
-			  const gchar     *str)
+    const gchar *str)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
-	gchar *str_escaped;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  gchar *str_escaped;
 
-	if (priv->pages_loading != 0) {
-		queue_item (&priv->message_queue, QUEUED_EVENT, NULL, str, FALSE);
-		return;
-	}
+  if (priv->pages_loading != 0)
+    {
+      queue_item (&priv->message_queue, QUEUED_EVENT, NULL, str, FALSE);
+      return;
+    }
 
-	str_escaped = g_markup_escape_text (str, -1);
-	theme_adium_append_event_escaped (view, str_escaped);
-	g_free (str_escaped);
+  str_escaped = g_markup_escape_text (str, -1);
+  theme_adium_append_event_escaped (view, str_escaped);
+  g_free (str_escaped);
 }
 
 static void
 theme_adium_append_event_markup (EmpathyChatView *view,
-				 const gchar     *markup_text,
-				 const gchar     *fallback_text)
+    const gchar *markup_text,
+    const gchar *fallback_text)
 {
-	theme_adium_append_event_escaped (view, markup_text);
+  theme_adium_append_event_escaped (view, markup_text);
 }
 
 static void
 theme_adium_edit_message (EmpathyChatView *view,
-			  EmpathyMessage  *message)
-{
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
-	WebKitDOMDocument *doc;
-	WebKitDOMElement *span;
-	gchar *id, *parsed_body;
-	gchar *tooltip, *timestamp;
-	GtkIconInfo *icon_info;
-	GError *error = NULL;
-
-	if (priv->pages_loading != 0) {
-		queue_item (&priv->message_queue, QUEUED_EDIT, message, NULL, FALSE);
-		return;
-	}
-
-	id = g_strdup_printf ("message-token-%s",
-		empathy_message_get_supersedes (message));
-	/* we don't pass a token here, because doing so will return another
-	 * <span> element, and we don't want nested <span> elements */
-	parsed_body = theme_adium_parse_body (EMPATHY_THEME_ADIUM (view),
-		empathy_message_get_body (message), NULL);
-
-	/* find the element */
-	doc = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-	span = webkit_dom_document_get_element_by_id (doc, id);
-
-	if (span == NULL) {
-		DEBUG ("Failed to find id '%s'", id);
-		goto except;
-	}
-
-	if (!WEBKIT_DOM_IS_HTML_ELEMENT (span)) {
-		DEBUG ("Not a HTML element");
-		goto except;
-	}
-
-	/* update the HTML */
-	webkit_dom_html_element_set_inner_html (WEBKIT_DOM_HTML_ELEMENT (span),
-		parsed_body, &error);
-
-	if (error != NULL) {
-		DEBUG ("Error setting new inner-HTML: %s", error->message);
-		g_error_free (error);
-		goto except;
-	}
-
-	/* set a tooltip */
-	timestamp = empathy_time_to_string_local (
-		empathy_message_get_timestamp (message),
-		"%H:%M:%S");
-	tooltip = g_strdup_printf (_("Message edited at %s"), timestamp);
-
-	webkit_dom_html_element_set_title (WEBKIT_DOM_HTML_ELEMENT (span),
-		tooltip);
-
-	g_free (tooltip);
-	g_free (timestamp);
-
-	/* mark this message as edited */
-	icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
-		EMPATHY_IMAGE_EDIT_MESSAGE, 16, 0);
-
-	if (icon_info != NULL) {
-		/* set the icon as a background image using CSS
-		 * FIXME: the icon won't update in response to theme changes */
-		gchar *style = g_strdup_printf (
-			"background-image:url('%s');"
-			"background-repeat:no-repeat;"
-			"background-position:left center;"
-			"padding-left:19px;", /* 16px icon + 3px padding */
-			gtk_icon_info_get_filename (icon_info));
-
-		webkit_dom_element_set_attribute (span, "style", style, &error);
-
-		if (error != NULL) {
-			DEBUG ("Error setting element style: %s",
-				error->message);
-			g_clear_error (&error);
-			/* not fatal */
-		}
-
-		g_free (style);
-		gtk_icon_info_free (icon_info);
-	}
-
-	goto finally;
+    EmpathyMessage *message)
+{
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  WebKitDOMDocument *doc;
+  WebKitDOMElement *span;
+  gchar *id, *parsed_body;
+  gchar *tooltip, *timestamp;
+  GtkIconInfo *icon_info;
+  GError *error = NULL;
+
+  if (priv->pages_loading != 0)
+    {
+      queue_item (&priv->message_queue, QUEUED_EDIT, message, NULL, FALSE);
+      return;
+    }
+
+  id = g_strdup_printf ("message-token-%s",
+    empathy_message_get_supersedes (message));
+  /* we don't pass a token here, because doing so will return another
+   * <span> element, and we don't want nested <span> elements */
+  parsed_body = theme_adium_parse_body (EMPATHY_THEME_ADIUM (view),
+    empathy_message_get_body (message), NULL);
+
+  /* find the element */
+  doc = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
+  span = webkit_dom_document_get_element_by_id (doc, id);
+
+  if (span == NULL)
+    {
+      DEBUG ("Failed to find id '%s'", id);
+      goto except;
+    }
+
+  if (!WEBKIT_DOM_IS_HTML_ELEMENT (span))
+    {
+      DEBUG ("Not a HTML element");
+      goto except;
+    }
+
+  /* update the HTML */
+  webkit_dom_html_element_set_inner_html (WEBKIT_DOM_HTML_ELEMENT (span),
+    parsed_body, &error);
+
+  if (error != NULL)
+    {
+      DEBUG ("Error setting new inner-HTML: %s", error->message);
+      g_error_free (error);
+      goto except;
+    }
+
+  /* set a tooltip */
+  timestamp = empathy_time_to_string_local (
+    empathy_message_get_timestamp (message),
+    "%H:%M:%S");
+  tooltip = g_strdup_printf (_("Message edited at %s"), timestamp);
+
+  webkit_dom_html_element_set_title (WEBKIT_DOM_HTML_ELEMENT (span),
+    tooltip);
+
+  g_free (tooltip);
+  g_free (timestamp);
+
+  /* mark this message as edited */
+  icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
+    EMPATHY_IMAGE_EDIT_MESSAGE, 16, 0);
+
+  if (icon_info != NULL)
+    {
+      /* set the icon as a background image using CSS
+       * FIXME: the icon won't update in response to theme changes */
+      gchar *style = g_strdup_printf (
+        "background-image:url('%s');"
+        "background-repeat:no-repeat;"
+        "background-position:left center;"
+        "padding-left:19px;", /* 16px icon + 3px padding */
+        gtk_icon_info_get_filename (icon_info));
+
+      webkit_dom_element_set_attribute (span, "style", style, &error);
+
+      if (error != NULL)
+        {
+          DEBUG ("Error setting element style: %s",
+            error->message);
+          g_clear_error (&error);
+          /* not fatal */
+        }
+
+      g_free (style);
+      gtk_icon_info_free (icon_info);
+    }
+
+  goto finally;
 
 except:
-	DEBUG ("Could not find message to edit with: %s",
-		empathy_message_get_body (message));
+  DEBUG ("Could not find message to edit with: %s",
+    empathy_message_get_body (message));
 
 finally:
-	g_free (id);
-	g_free (parsed_body);
+  g_free (id);
+  g_free (parsed_body);
 }
 
 static void
 theme_adium_scroll (EmpathyChatView *view,
-		    gboolean         allow_scrolling)
+    gboolean allow_scrolling)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+
+  priv->allow_scrolling = allow_scrolling;
 
-	priv->allow_scrolling = allow_scrolling;
-	if (allow_scrolling) {
-		empathy_chat_view_scroll_down (view);
-	}
+  if (allow_scrolling)
+    empathy_chat_view_scroll_down (view);
 }
 
 static void
 theme_adium_scroll_down (EmpathyChatView *view)
 {
-	webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view), "alignChat(true);");
+  webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view), "alignChat(true);");
 }
 
 static gboolean
 theme_adium_get_has_selection (EmpathyChatView *view)
 {
-	return webkit_web_view_has_selection (WEBKIT_WEB_VIEW (view));
+  return webkit_web_view_has_selection (WEBKIT_WEB_VIEW (view));
 }
 
 static void
 theme_adium_clear (EmpathyChatView *view)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
 
-	theme_adium_load_template (EMPATHY_THEME_ADIUM (view));
+  theme_adium_load_template (EMPATHY_THEME_ADIUM (view));
 
-	/* Clear last contact to avoid trying to add a 'joined'
-	 * message when we don't have an insertion point. */
-	if (priv->last_contact) {
-		g_object_unref (priv->last_contact);
-		priv->last_contact = NULL;
-	}
+  /* Clear last contact to avoid trying to add a 'joined'
+   * message when we don't have an insertion point. */
+  if (priv->last_contact)
+    {
+      g_object_unref (priv->last_contact);
+      priv->last_contact = NULL;
+    }
 }
 
 static gboolean
 theme_adium_find_previous (EmpathyChatView *view,
-			   const gchar     *search_criteria,
-			   gboolean         new_search,
-			   gboolean         match_case)
+    const gchar *search_criteria,
+    gboolean new_search,
+    gboolean match_case)
 {
-	/* FIXME: Doesn't respect new_search */
-	return webkit_web_view_search_text (WEBKIT_WEB_VIEW (view),
-					    search_criteria, match_case,
-					    FALSE, TRUE);
+  /* FIXME: Doesn't respect new_search */
+  return webkit_web_view_search_text (WEBKIT_WEB_VIEW (view),
+      search_criteria, match_case, FALSE, TRUE);
 }
 
 static gboolean
 theme_adium_find_next (EmpathyChatView *view,
-		       const gchar     *search_criteria,
-		       gboolean         new_search,
-		       gboolean         match_case)
+    const gchar *search_criteria,
+    gboolean new_search,
+    gboolean match_case)
 {
-	/* FIXME: Doesn't respect new_search */
-	return webkit_web_view_search_text (WEBKIT_WEB_VIEW (view),
-					    search_criteria, match_case,
-					    TRUE, TRUE);
+  /* FIXME: Doesn't respect new_search */
+  return webkit_web_view_search_text (WEBKIT_WEB_VIEW (view),
+      search_criteria, match_case, TRUE, TRUE);
 }
 
 static void
 theme_adium_find_abilities (EmpathyChatView *view,
-			    const gchar    *search_criteria,
-                            gboolean        match_case,
-			    gboolean       *can_do_previous,
-			    gboolean       *can_do_next)
+    const gchar *search_criteria,
+    gboolean match_case,
+    gboolean *can_do_previous,
+    gboolean *can_do_next)
 {
-	/* FIXME: Does webkit provide an API for that? We have wrap=true in
-	 * find_next and find_previous to work around this problem. */
-	if (can_do_previous)
-		*can_do_previous = TRUE;
-	if (can_do_next)
-		*can_do_next = TRUE;
+  /* FIXME: Does webkit provide an API for that? We have wrap=true in
+   * find_next and find_previous to work around this problem. */
+  if (can_do_previous)
+    *can_do_previous = TRUE;
+  if (can_do_next)
+    *can_do_next = TRUE;
 }
 
 static void
 theme_adium_highlight (EmpathyChatView *view,
-		       const gchar     *text,
-		       gboolean         match_case)
+    const gchar *text,
+    gboolean match_case)
 {
-	webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (view));
-	webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (view),
-					   text, match_case, 0);
-	webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW (view),
-						    TRUE);
+  webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (view));
+  webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (view),
+      text, match_case, 0);
+  webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW (view),
+      TRUE);
 }
 
 static void
 theme_adium_copy_clipboard (EmpathyChatView *view)
 {
-	webkit_web_view_copy_clipboard (WEBKIT_WEB_VIEW (view));
+  webkit_web_view_copy_clipboard (WEBKIT_WEB_VIEW (view));
 }
 
 static void
 theme_adium_remove_mark_from_message (EmpathyThemeAdium *self,
-				      guint32 id)
+    guint32 id)
 {
-	WebKitDOMDocument *dom;
-	WebKitDOMNodeList *nodes;
-	gchar *class;
-	GError *error = NULL;
+  WebKitDOMDocument *dom;
+  WebKitDOMNodeList *nodes;
+  gchar *class;
+  GError *error = NULL;
 
-	dom = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (self));
-	if (dom == NULL) {
-		return;
-	}
+  dom = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (self));
+  if (dom == NULL)
+    return;
 
-	class = g_strdup_printf (".x-empathy-message-id-%u", id);
+  class = g_strdup_printf (".x-empathy-message-id-%u", id);
 
-	/* Get all nodes with focus class */
-	nodes = webkit_dom_document_query_selector_all (dom, class, &error);
-	g_free (class);
+  /* Get all nodes with focus class */
+  nodes = webkit_dom_document_query_selector_all (dom, class, &error);
+  g_free (class);
 
-	if (nodes == NULL) {
-		DEBUG ("Error getting focus nodes: %s",
-			error ? error->message : "No error");
-		g_clear_error (&error);
-		return;
-	}
+  if (nodes == NULL)
+    {
+      DEBUG ("Error getting focus nodes: %s",
+        error ? error->message : "No error");
+      g_clear_error (&error);
+      return;
+    }
 
-	theme_adium_remove_focus_marks (self, nodes);
+  theme_adium_remove_focus_marks (self, nodes);
 }
 
 static void
 theme_adium_remove_acked_message_unread_mark_foreach (gpointer data,
-						      gpointer user_data)
+    gpointer user_data)
 {
-	EmpathyThemeAdium *self = user_data;
-	guint32 id = GPOINTER_TO_UINT (data);
+  EmpathyThemeAdium *self = user_data;
+  guint32 id = GPOINTER_TO_UINT (data);
 
-	theme_adium_remove_mark_from_message (self, id);
+  theme_adium_remove_mark_from_message (self, id);
 }
 
 static void
 theme_adium_focus_toggled (EmpathyChatView *view,
-			   gboolean         has_focus)
+    gboolean has_focus)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
 
-	priv->has_focus = has_focus;
-	if (!priv->has_focus) {
-		/* We've lost focus, so let's make sure all the acked
-		 * messages have lost their unread marker. */
-		g_queue_foreach (&priv->acked_messages,
-				 theme_adium_remove_acked_message_unread_mark_foreach,
-				 view);
-		g_queue_clear (&priv->acked_messages);
+  priv->has_focus = has_focus;
+  if (!priv->has_focus)
+    {
+      /* We've lost focus, so let's make sure all the acked
+       * messages have lost their unread marker. */
+      g_queue_foreach (&priv->acked_messages,
+          theme_adium_remove_acked_message_unread_mark_foreach, view);
+      g_queue_clear (&priv->acked_messages);
 
-		priv->has_unread_message = FALSE;
-	}
+      priv->has_unread_message = FALSE;
+    }
 }
 
 static void
 theme_adium_message_acknowledged (EmpathyChatView *view,
-				  EmpathyMessage  *message)
+    EmpathyMessage *message)
 {
-	EmpathyThemeAdium *self = (EmpathyThemeAdium *) view;
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
-	TpMessage *tp_msg;
-	guint32 id;
-	gboolean valid;
+  EmpathyThemeAdium *self = (EmpathyThemeAdium *) view;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  TpMessage *tp_msg;
+  guint32 id;
+  gboolean valid;
 
-	tp_msg = empathy_message_get_tp_message (message);
+  tp_msg = empathy_message_get_tp_message (message);
 
-	if (tp_msg == NULL) {
-		return;
-	}
+  if (tp_msg == NULL)
+    return;
 
-	id = tp_message_get_pending_message_id (tp_msg, &valid);
-	if (!valid) {
-		g_warning ("Acknoledged message doesn't have a pending ID");
-		return;
-	}
+  id = tp_message_get_pending_message_id (tp_msg, &valid);
+  if (!valid)
+    {
+      g_warning ("Acknoledged message doesn't have a pending ID");
+      return;
+    }
 
-	/* We only want to actually remove the unread marker if the
-	 * view doesn't have focus. If we did it all the time we would
-	 * never see the unread markers, ever! So, we'll queue these
-	 * up, and when we lose focus, we'll remove the markers. */
-	if (priv->has_focus) {
-		g_queue_push_tail (&priv->acked_messages,
-				   GUINT_TO_POINTER (id));
-		return;
-	}
+  /* We only want to actually remove the unread marker if the
+   * view doesn't have focus. If we did it all the time we would
+   * never see the unread markers, ever! So, we'll queue these
+   * up, and when we lose focus, we'll remove the markers. */
+  if (priv->has_focus)
+    {
+      g_queue_push_tail (&priv->acked_messages,
+             GUINT_TO_POINTER (id));
+      return;
+    }
 
-	theme_adium_remove_mark_from_message (self, id);
+  theme_adium_remove_mark_from_message (self, id);
 }
 
 static gboolean
-theme_adium_button_press_event (GtkWidget *widget, GdkEventButton *event)
+theme_adium_button_press_event (GtkWidget *widget,
+    GdkEventButton *event)
 {
-	if (event->button == 3) {
-		gboolean developer_tools_enabled;
-
-		g_object_get (G_OBJECT (webkit_web_view_get_settings (WEBKIT_WEB_VIEW (widget))),
-			      "enable-developer-extras", &developer_tools_enabled, NULL);
-
-		/* We currently have no way to add an inspector menu
-		 * item ourselves, so we disable our customized menu
-		 * if the developer extras are enabled. */
-		if (!developer_tools_enabled) {
-			empathy_webkit_context_menu_for_event (
-				WEBKIT_WEB_VIEW (widget), event,
-				EMPATHY_WEBKIT_MENU_CLEAR);
-			return TRUE;
-		}
-	}
+  if (event->button == 3)
+    {
+      gboolean developer_tools_enabled;
+
+      g_object_get (
+          G_OBJECT (webkit_web_view_get_settings (WEBKIT_WEB_VIEW (widget))),
+          "enable-developer-extras", &developer_tools_enabled, NULL);
+
+      /* We currently have no way to add an inspector menu
+       * item ourselves, so we disable our customized menu
+       * if the developer extras are enabled. */
+      if (!developer_tools_enabled)
+        {
+          empathy_webkit_context_menu_for_event (
+            WEBKIT_WEB_VIEW (widget), event,
+            EMPATHY_WEBKIT_MENU_CLEAR);
+          return TRUE;
+        }
+    }
 
-	return GTK_WIDGET_CLASS (empathy_theme_adium_parent_class)->button_press_event (widget, event);
+  return GTK_WIDGET_CLASS (
+      empathy_theme_adium_parent_class)->button_press_event (widget, event);
 }
 
 static void
 theme_adium_set_show_avatars (EmpathyChatView *view,
-			      gboolean show_avatars)
+    gboolean show_avatars)
 {
-	EmpathyThemeAdium     *theme = EMPATHY_THEME_ADIUM (view);
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (view);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
 
-	priv->show_avatars = show_avatars;
+  priv->show_avatars = show_avatars;
 }
 
 static void
 theme_adium_iface_init (EmpathyChatViewIface *iface)
 {
-	iface->append_message = theme_adium_append_message;
-	iface->append_event = theme_adium_append_event;
-	iface->append_event_markup = theme_adium_append_event_markup;
-	iface->edit_message = theme_adium_edit_message;
-	iface->scroll = theme_adium_scroll;
-	iface->scroll_down = theme_adium_scroll_down;
-	iface->get_has_selection = theme_adium_get_has_selection;
-	iface->clear = theme_adium_clear;
-	iface->find_previous = theme_adium_find_previous;
-	iface->find_next = theme_adium_find_next;
-	iface->find_abilities = theme_adium_find_abilities;
-	iface->highlight = theme_adium_highlight;
-	iface->copy_clipboard = theme_adium_copy_clipboard;
-	iface->focus_toggled = theme_adium_focus_toggled;
-	iface->message_acknowledged = theme_adium_message_acknowledged;
-	iface->set_show_avatars = theme_adium_set_show_avatars;
+  iface->append_message = theme_adium_append_message;
+  iface->append_event = theme_adium_append_event;
+  iface->append_event_markup = theme_adium_append_event_markup;
+  iface->edit_message = theme_adium_edit_message;
+  iface->scroll = theme_adium_scroll;
+  iface->scroll_down = theme_adium_scroll_down;
+  iface->get_has_selection = theme_adium_get_has_selection;
+  iface->clear = theme_adium_clear;
+  iface->find_previous = theme_adium_find_previous;
+  iface->find_next = theme_adium_find_next;
+  iface->find_abilities = theme_adium_find_abilities;
+  iface->highlight = theme_adium_highlight;
+  iface->copy_clipboard = theme_adium_copy_clipboard;
+  iface->focus_toggled = theme_adium_focus_toggled;
+  iface->message_acknowledged = theme_adium_message_acknowledged;
+  iface->set_show_avatars = theme_adium_set_show_avatars;
 }
 
 static void
-theme_adium_load_finished_cb (WebKitWebView  *view,
-			      WebKitWebFrame *frame,
-			      gpointer        user_data)
+theme_adium_load_finished_cb (WebKitWebView *view,
+    WebKitWebFrame *frame,
+    gpointer user_data)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
-	EmpathyChatView       *chat_view = EMPATHY_CHAT_VIEW (view);
-	GList                 *l;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+  EmpathyChatView *chat_view = EMPATHY_CHAT_VIEW (view);
+  GList *l;
 
-	DEBUG ("Page loaded");
-	priv->pages_loading--;
+  DEBUG ("Page loaded");
+  priv->pages_loading--;
 
-	if (priv->pages_loading != 0)
-		return;
+  if (priv->pages_loading != 0)
+    return;
 
-	/* Display queued messages */
-	for (l = priv->message_queue.head; l != NULL; l = l->next) {
-		QueuedItem *item = l->data;
+  /* Display queued messages */
+  for (l = priv->message_queue.head; l != NULL; l = l->next)
+    {
+      QueuedItem *item = l->data;
 
-		switch (item->type)
-		{
-			case QUEUED_MESSAGE:
-				theme_adium_append_message (chat_view, item->msg,
-					item->should_highlight);
-				break;
+      switch (item->type)
+        {
+          case QUEUED_MESSAGE:
+            theme_adium_append_message (chat_view, item->msg,
+              item->should_highlight);
+            break;
 
-			case QUEUED_EDIT:
-				theme_adium_edit_message (chat_view, item->msg);
-				break;
+          case QUEUED_EDIT:
+            theme_adium_edit_message (chat_view, item->msg);
+            break;
 
-			case QUEUED_EVENT:
-				theme_adium_append_event (chat_view, item->str);
-				break;
-		}
+          case QUEUED_EVENT:
+            theme_adium_append_event (chat_view, item->str);
+            break;
+        }
 
-		free_queued_item (item);
-	}
+      free_queued_item (item);
+    }
 
-	g_queue_clear (&priv->message_queue);
+  g_queue_clear (&priv->message_queue);
 }
 
 static void
 theme_adium_finalize (GObject *object)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
 
-	empathy_adium_data_unref (priv->data);
+  empathy_adium_data_unref (priv->data);
 
-	g_object_unref (priv->gsettings_chat);
-	g_object_unref (priv->gsettings_desktop);
+  g_object_unref (priv->gsettings_chat);
+  g_object_unref (priv->gsettings_desktop);
 
-	G_OBJECT_CLASS (empathy_theme_adium_parent_class)->finalize (object);
+  G_OBJECT_CLASS (empathy_theme_adium_parent_class)->finalize (object);
 }
 
 static void
 theme_adium_dispose (GObject *object)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
 
-	if (priv->smiley_manager) {
-		g_object_unref (priv->smiley_manager);
-		priv->smiley_manager = NULL;
-	}
+  if (priv->smiley_manager)
+    {
+      g_object_unref (priv->smiley_manager);
+      priv->smiley_manager = NULL;
+    }
 
-	if (priv->last_contact) {
-		g_object_unref (priv->last_contact);
-		priv->last_contact = NULL;
-	}
+  if (priv->last_contact)
+    {
+      g_object_unref (priv->last_contact);
+      priv->last_contact = NULL;
+    }
 
-	if (priv->inspector_window) {
-		gtk_widget_destroy (priv->inspector_window);
-		priv->inspector_window = NULL;
-	}
+  if (priv->inspector_window)
+    {
+      gtk_widget_destroy (priv->inspector_window);
+      priv->inspector_window = NULL;
+    }
 
-	if (priv->acked_messages.length > 0) {
-		g_queue_clear (&priv->acked_messages);
-	}
+  if (priv->acked_messages.length > 0)
+    {
+      g_queue_clear (&priv->acked_messages);
+    }
 
-	G_OBJECT_CLASS (empathy_theme_adium_parent_class)->dispose (object);
+  G_OBJECT_CLASS (empathy_theme_adium_parent_class)->dispose (object);
 }
 
 static gboolean
 theme_adium_inspector_show_window_cb (WebKitWebInspector *inspector,
-				      EmpathyThemeAdium  *theme)
+    EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
 
-	if (priv->inspector_window) {
-		gtk_widget_show_all (priv->inspector_window);
-	}
+  if (priv->inspector_window)
+    {
+      gtk_widget_show_all (priv->inspector_window);
+    }
 
-	return TRUE;
+  return TRUE;
 }
 
 static gboolean
 theme_adium_inspector_close_window_cb (WebKitWebInspector *inspector,
-				       EmpathyThemeAdium  *theme)
+    EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
 
-	if (priv->inspector_window) {
-		gtk_widget_hide (priv->inspector_window);
-	}
+  if (priv->inspector_window)
+    {
+      gtk_widget_hide (priv->inspector_window);
+    }
 
-	return TRUE;
+  return TRUE;
 }
 
 static WebKitWebView *
 theme_adium_inspect_web_view_cb (WebKitWebInspector *inspector,
-				 WebKitWebView      *web_view,
-				 EmpathyThemeAdium  *theme)
-{
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	GtkWidget             *scrolled_window;
-	GtkWidget             *inspector_web_view;
-
-	if (!priv->inspector_window) {
-		/* Create main window */
-		priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-		gtk_window_set_default_size (GTK_WINDOW (priv->inspector_window),
-					     800, 600);
-		g_signal_connect (priv->inspector_window, "delete-event",
-				  G_CALLBACK (gtk_widget_hide_on_delete), NULL);
-
-		/* Pack a scrolled window */
-		scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-		gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
-						GTK_POLICY_AUTOMATIC,
-						GTK_POLICY_AUTOMATIC);
-		gtk_container_add (GTK_CONTAINER (priv->inspector_window),
-				   scrolled_window);
-		gtk_widget_show  (scrolled_window);
-
-		/* Pack a webview in the scrolled window. That webview will be
-		 * used to render the inspector tool.  */
-		inspector_web_view = webkit_web_view_new ();
-		gtk_container_add (GTK_CONTAINER (scrolled_window),
-				   inspector_web_view);
-		gtk_widget_show (scrolled_window);
-
-		return WEBKIT_WEB_VIEW (inspector_web_view);
-	}
-
-	return NULL;
+    WebKitWebView *web_view,
+    EmpathyThemeAdium *theme)
+{
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  GtkWidget *scrolled_window;
+  GtkWidget *inspector_web_view;
+
+  if (!priv->inspector_window)
+    {
+      /* Create main window */
+      priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+      gtk_window_set_default_size (GTK_WINDOW (priv->inspector_window),
+                 800, 600);
+
+      g_signal_connect (priv->inspector_window, "delete-event",
+            G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+
+      /* Pack a scrolled window */
+      scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+
+      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+              GTK_POLICY_AUTOMATIC,
+              GTK_POLICY_AUTOMATIC);
+      gtk_container_add (GTK_CONTAINER (priv->inspector_window),
+             scrolled_window);
+      gtk_widget_show (scrolled_window);
+
+      /* Pack a webview in the scrolled window. That webview will be
+       * used to render the inspector tool. */
+      inspector_web_view = webkit_web_view_new ();
+      gtk_container_add (GTK_CONTAINER (scrolled_window),
+             inspector_web_view);
+      gtk_widget_show (scrolled_window);
+
+      return WEBKIT_WEB_VIEW (inspector_web_view);
+    }
+
+  return NULL;
 }
 
 static void
 theme_adium_constructed (GObject *object)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
-	const gchar           *font_family = NULL;
-	gint                   font_size = 0;
-	WebKitWebView         *webkit_view = WEBKIT_WEB_VIEW (object);
-	WebKitWebInspector    *webkit_inspector;
-
-	/* Set default settings */
-	font_family = tp_asv_get_string (priv->data->info, "DefaultFontFamily");
-	font_size = tp_asv_get_int32 (priv->data->info, "DefaultFontSize", NULL);
-
-	if (font_family && font_size) {
-		g_object_set (webkit_web_view_get_settings (webkit_view),
-			"default-font-family", font_family,
-			"default-font-size", font_size,
-			NULL);
-	} else {
-		empathy_webkit_bind_font_setting (webkit_view,
-			priv->gsettings_desktop,
-			EMPATHY_PREFS_DESKTOP_INTERFACE_DOCUMENT_FONT_NAME);
-	}
-
-	/* Setup webkit inspector */
-	webkit_inspector = webkit_web_view_get_inspector (webkit_view);
-	g_signal_connect (webkit_inspector, "inspect-web-view",
-			  G_CALLBACK (theme_adium_inspect_web_view_cb),
-			  object);
-	g_signal_connect (webkit_inspector, "show-window",
-			  G_CALLBACK (theme_adium_inspector_show_window_cb),
-			  object);
-	g_signal_connect (webkit_inspector, "close-window",
-			  G_CALLBACK (theme_adium_inspector_close_window_cb),
-			  object);
-
-	/* Load template */
-	theme_adium_load_template (EMPATHY_THEME_ADIUM (object));
-
-	priv->in_construction = FALSE;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
+  const gchar *font_family = NULL;
+  gint font_size = 0;
+  WebKitWebView *webkit_view = WEBKIT_WEB_VIEW (object);
+  WebKitWebInspector *webkit_inspector;
+
+  /* Set default settings */
+  font_family = tp_asv_get_string (priv->data->info, "DefaultFontFamily");
+  font_size = tp_asv_get_int32 (priv->data->info, "DefaultFontSize", NULL);
+
+  if (font_family && font_size)
+    {
+      g_object_set (webkit_web_view_get_settings (webkit_view),
+        "default-font-family", font_family,
+        "default-font-size", font_size,
+        NULL);
+    }
+  else
+    {
+      empathy_webkit_bind_font_setting (webkit_view,
+        priv->gsettings_desktop,
+        EMPATHY_PREFS_DESKTOP_INTERFACE_DOCUMENT_FONT_NAME);
+    }
+
+  /* Setup webkit inspector */
+  webkit_inspector = webkit_web_view_get_inspector (webkit_view);
+  g_signal_connect (webkit_inspector, "inspect-web-view",
+      G_CALLBACK (theme_adium_inspect_web_view_cb), object);
+  g_signal_connect (webkit_inspector, "show-window",
+      G_CALLBACK (theme_adium_inspector_show_window_cb), object);
+  g_signal_connect (webkit_inspector, "close-window",
+      G_CALLBACK (theme_adium_inspector_close_window_cb), object);
+
+  /* Load template */
+  theme_adium_load_template (EMPATHY_THEME_ADIUM (object));
+
+  priv->in_construction = FALSE;
 }
 
 static void
-theme_adium_get_property (GObject    *object,
-			  guint       param_id,
-			  GValue     *value,
-			  GParamSpec *pspec)
-{
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
-
-	switch (param_id) {
-	case PROP_ADIUM_DATA:
-		g_value_set_boxed (value, priv->data);
-		break;
-	case PROP_VARIANT:
-		g_value_set_string (value, priv->variant);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
+theme_adium_get_property (GObject *object,
+    guint param_id,
+    GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
+
+  switch (param_id)
+    {
+      case PROP_ADIUM_DATA:
+        g_value_set_boxed (value, priv->data);
+        break;
+      case PROP_VARIANT:
+        g_value_set_string (value, priv->variant);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    };
 }
 
 static void
-theme_adium_set_property (GObject      *object,
-			  guint         param_id,
-			  const GValue *value,
-			  GParamSpec   *pspec)
-{
-	EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (object);
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
-
-	switch (param_id) {
-	case PROP_ADIUM_DATA:
-		g_assert (priv->data == NULL);
-		priv->data = g_value_dup_boxed (value);
-		break;
-	case PROP_VARIANT:
-		empathy_theme_adium_set_variant (theme, g_value_get_string (value));
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
+theme_adium_set_property (GObject *object,
+    guint param_id,
+    const GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (object);
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (object);
+
+  switch (param_id)
+    {
+      case PROP_ADIUM_DATA:
+        g_assert (priv->data == NULL);
+        priv->data = g_value_dup_boxed (value);
+        break;
+      case PROP_VARIANT:
+        empathy_theme_adium_set_variant (theme, g_value_get_string (value));
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    };
 }
 
 static void
 empathy_theme_adium_class_init (EmpathyThemeAdiumClass *klass)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
-
-	object_class->finalize = theme_adium_finalize;
-	object_class->dispose = theme_adium_dispose;
-	object_class->constructed = theme_adium_constructed;
-	object_class->get_property = theme_adium_get_property;
-	object_class->set_property = theme_adium_set_property;
-
-	widget_class->button_press_event = theme_adium_button_press_event;
-
-	g_object_class_install_property (object_class,
-					 PROP_ADIUM_DATA,
-					 g_param_spec_boxed ("adium-data",
-							     "The theme data",
-							     "Data for the adium theme",
-							      EMPATHY_TYPE_ADIUM_DATA,
-							      G_PARAM_CONSTRUCT_ONLY |
-							      G_PARAM_READWRITE |
-							      G_PARAM_STATIC_STRINGS));
-	g_object_class_install_property (object_class,
-					 PROP_VARIANT,
-					 g_param_spec_string ("variant",
-							      "The theme variant",
-							      "Variant name for the theme",
-							      NULL,
-							      G_PARAM_CONSTRUCT |
-							      G_PARAM_READWRITE |
-							      G_PARAM_STATIC_STRINGS));
-
-	g_type_class_add_private (object_class, sizeof (EmpathyThemeAdiumPriv));
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->finalize = theme_adium_finalize;
+  object_class->dispose = theme_adium_dispose;
+  object_class->constructed = theme_adium_constructed;
+  object_class->get_property = theme_adium_get_property;
+  object_class->set_property = theme_adium_set_property;
+
+  widget_class->button_press_event = theme_adium_button_press_event;
+
+  g_object_class_install_property (object_class, PROP_ADIUM_DATA,
+      g_param_spec_boxed ("adium-data",
+        "The theme data",
+        "Data for the adium theme",
+        EMPATHY_TYPE_ADIUM_DATA,
+        G_PARAM_CONSTRUCT_ONLY |
+        G_PARAM_READWRITE |
+        G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (object_class, PROP_VARIANT,
+      g_param_spec_string ("variant",
+        "The theme variant",
+        "Variant name for the theme",
+        NULL,
+        G_PARAM_CONSTRUCT |
+        G_PARAM_READWRITE |
+        G_PARAM_STATIC_STRINGS));
+
+  g_type_class_add_private (object_class, sizeof (EmpathyThemeAdiumPriv));
 }
 
 static void
 empathy_theme_adium_init (EmpathyThemeAdium *theme)
 {
-	EmpathyThemeAdiumPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (theme,
-		EMPATHY_TYPE_THEME_ADIUM, EmpathyThemeAdiumPriv);
+  EmpathyThemeAdiumPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (theme,
+    EMPATHY_TYPE_THEME_ADIUM, EmpathyThemeAdiumPriv);
 
-	theme->priv = priv;
+  theme->priv = priv;
 
-	priv->in_construction = TRUE;
-	g_queue_init (&priv->message_queue);
-	priv->allow_scrolling = TRUE;
-	priv->smiley_manager = empathy_smiley_manager_dup_singleton ();
+  priv->in_construction = TRUE;
+  g_queue_init (&priv->message_queue);
+  priv->allow_scrolling = TRUE;
+  priv->smiley_manager = empathy_smiley_manager_dup_singleton ();
 
-	/* Show avatars by default. */
-	priv->show_avatars = TRUE;
+  /* Show avatars by default. */
+  priv->show_avatars = TRUE;
 
-	g_signal_connect (theme, "load-finished",
-			  G_CALLBACK (theme_adium_load_finished_cb),
-			  NULL);
-	g_signal_connect (theme, "navigation-policy-decision-requested",
-			  G_CALLBACK (theme_adium_navigation_policy_decision_requested_cb),
-			  NULL);
+  g_signal_connect (theme, "load-finished",
+      G_CALLBACK (theme_adium_load_finished_cb), NULL);
+  g_signal_connect (theme, "navigation-policy-decision-requested",
+        G_CALLBACK (theme_adium_navigation_policy_decision_requested_cb), NULL);
 
-	priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
-	priv->gsettings_desktop = g_settings_new (
-		EMPATHY_PREFS_DESKTOP_INTERFACE_SCHEMA);
+  priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
+  priv->gsettings_desktop = g_settings_new (
+    EMPATHY_PREFS_DESKTOP_INTERFACE_SCHEMA);
 
-	g_signal_connect (priv->gsettings_chat,
-		"changed::" EMPATHY_PREFS_CHAT_WEBKIT_DEVELOPER_TOOLS,
-		G_CALLBACK (theme_adium_notify_enable_webkit_developer_tools_cb),
-		theme);
+  g_signal_connect (priv->gsettings_chat,
+    "changed::" EMPATHY_PREFS_CHAT_WEBKIT_DEVELOPER_TOOLS,
+    G_CALLBACK (theme_adium_notify_enable_webkit_developer_tools_cb),
+    theme);
 
-	theme_adium_update_enable_webkit_developer_tools (theme);
+  theme_adium_update_enable_webkit_developer_tools (theme);
 }
 
 EmpathyThemeAdium *
 empathy_theme_adium_new (EmpathyAdiumData *data,
-			 const gchar *variant)
+    const gchar *variant)
 {
-	g_return_val_if_fail (data != NULL, NULL);
+  g_return_val_if_fail (data != NULL, NULL);
 
-	return g_object_new (EMPATHY_TYPE_THEME_ADIUM,
-			     "adium-data", data,
-			     "variant", variant,
-			     NULL);
+  return g_object_new (EMPATHY_TYPE_THEME_ADIUM,
+      "adium-data", data,
+      "variant", variant,
+      NULL);
 }
 
 void
 empathy_theme_adium_set_variant (EmpathyThemeAdium *theme,
-				 const gchar *variant)
+    const gchar *variant)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	gchar *variant_path;
-	gchar *script;
+  EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+  gchar *variant_path;
+  gchar *script;
 
-	if (!tp_strdiff (priv->variant, variant)) {
-		return;
-	}
+  if (!tp_strdiff (priv->variant, variant))
+    return;
 
-	g_free (priv->variant);
-	priv->variant = g_strdup (variant);
+  g_free (priv->variant);
+  priv->variant = g_strdup (variant);
 
-	if (priv->in_construction) {
-		return;
-	}
+  if (priv->in_construction)
+    return;
 
-	DEBUG ("Update view with variant: '%s'", variant);
-	variant_path = adium_info_dup_path_for_variant (priv->data->info,
-		priv->variant);
-	script = g_strdup_printf ("setStylesheet(\"mainStyle\",\"%s\");", variant_path);
+  DEBUG ("Update view with variant: '%s'", variant);
+  variant_path = adium_info_dup_path_for_variant (priv->data->info,
+    priv->variant);
+  script = g_strdup_printf ("setStylesheet(\"mainStyle\",\"%s\");",
+      variant_path);
 
-	webkit_web_view_execute_script (WEBKIT_WEB_VIEW (theme), script);
+  webkit_web_view_execute_script (WEBKIT_WEB_VIEW (theme), script);
 
-	g_free (variant_path);
-	g_free (script);
+  g_free (variant_path);
+  g_free (script);
 
-	g_object_notify (G_OBJECT (theme), "variant");
+  g_object_notify (G_OBJECT (theme), "variant");
 }
 
 void
 empathy_theme_adium_show_inspector (EmpathyThemeAdium *theme)
 {
-	WebKitWebView      *web_view = WEBKIT_WEB_VIEW (theme);
-	WebKitWebInspector *inspector;
+  WebKitWebView *web_view = WEBKIT_WEB_VIEW (theme);
+  WebKitWebInspector *inspector;
 
-	g_object_set (G_OBJECT (webkit_web_view_get_settings (web_view)),
-		      "enable-developer-extras", TRUE,
-		      NULL);
+  g_object_set (G_OBJECT (webkit_web_view_get_settings (web_view)),
+      "enable-developer-extras", TRUE, NULL);
 
-	inspector = webkit_web_view_get_inspector (web_view);
-	webkit_web_inspector_show (inspector);
+  inspector = webkit_web_view_get_inspector (web_view);
+  webkit_web_inspector_show (inspector);
 }
 
 gboolean
 empathy_adium_path_is_valid (const gchar *path)
 {
-	gboolean ret;
-	gchar   *file;
+  gboolean ret;
+  gchar *file;
 
-	if (path[0] != '/')
-		return FALSE;
+  if (path[0] != '/')
+    return FALSE;
 
-	/* The theme is not valid if there is no Info.plist */
-	file = g_build_filename (path, "Contents", "Info.plist",
-				 NULL);
-	ret = g_file_test (file, G_FILE_TEST_EXISTS);
-	g_free (file);
+  /* The theme is not valid if there is no Info.plist */
+  file = g_build_filename (path, "Contents", "Info.plist",
+         NULL);
+  ret = g_file_test (file, G_FILE_TEST_EXISTS);
+  g_free (file);
 
-	if (!ret)
-		return FALSE;
+  if (!ret)
+    return FALSE;
 
-	/* We ship a default Template.html as fallback if there is any problem
-	 * with the one inside the theme. The only other required file is
-	 * Content.html OR Incoming/Content.html*/
-	file = g_build_filename (path, "Contents", "Resources", "Content.html",
-				 NULL);
-	ret = g_file_test (file, G_FILE_TEST_EXISTS);
-	g_free (file);
+  /* We ship a default Template.html as fallback if there is any problem
+   * with the one inside the theme. The only other required file is
+   * Content.html OR Incoming/Content.html*/
+  file = g_build_filename (path, "Contents", "Resources", "Content.html",
+      NULL);
+  ret = g_file_test (file, G_FILE_TEST_EXISTS);
+  g_free (file);
 
-	if (!ret) {
-		file = g_build_filename (path, "Contents", "Resources", "Incoming",
-					 "Content.html", NULL);
-		ret = g_file_test (file, G_FILE_TEST_EXISTS);
-		g_free (file);
-	}
+  if (!ret)
+    {
+      file = g_build_filename (path, "Contents", "Resources", "Incoming",
+             "Content.html", NULL);
+      ret = g_file_test (file, G_FILE_TEST_EXISTS);
+      g_free (file);
+    }
 
-	return ret;
+  return ret;
 }
 
 GHashTable *
 empathy_adium_info_new (const gchar *path)
 {
-	gchar *file;
-	GValue *value;
-	GHashTable *info = NULL;
+  gchar *file;
+  GValue *value;
+  GHashTable *info = NULL;
 
-	g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL);
+  g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL);
 
-	file = g_build_filename (path, "Contents", "Info.plist", NULL);
-	value = empathy_plist_parse_from_file (file);
-	g_free (file);
+  file = g_build_filename (path, "Contents", "Info.plist", NULL);
+  value = empathy_plist_parse_from_file (file);
+  g_free (file);
 
-	if (value == NULL)
-		return NULL;
+  if (value == NULL)
+    return NULL;
 
-	info = g_value_dup_boxed (value);
-	tp_g_value_slice_free (value);
+  info = g_value_dup_boxed (value);
+  tp_g_value_slice_free (value);
 
-	/* Insert the theme's path into the hash table,
-	 * keys have to be dupped */
-	tp_asv_set_string (info, g_strdup ("path"), path);
+  /* Insert the theme's path into the hash table,
+   * keys have to be dupped */
+  tp_asv_set_string (info, g_strdup ("path"), path);
 
-	return info;
+  return info;
 }
 
 static guint
 adium_info_get_version (GHashTable *info)
 {
-	return tp_asv_get_int32 (info, "MessageViewVersion", NULL);
+  return tp_asv_get_int32 (info, "MessageViewVersion", NULL);
 }
 
 static const gchar *
 adium_info_get_no_variant_name (GHashTable *info)
 {
-	const gchar *name = tp_asv_get_string (info, "DisplayNameForNoVariant");
-	return name ? name : _("Normal");
+  const gchar *name = tp_asv_get_string (info, "DisplayNameForNoVariant");
+  return name ? name : _("Normal");
 }
 
 static gchar *
 adium_info_dup_path_for_variant (GHashTable *info,
-				 const gchar *variant)
+    const gchar *variant)
 {
-	guint version = adium_info_get_version (info);
-	const gchar *no_variant = adium_info_get_no_variant_name (info);
-	GPtrArray *variants;
-	guint i;
+  guint version = adium_info_get_version (info);
+  const gchar *no_variant = adium_info_get_no_variant_name (info);
+  GPtrArray *variants;
+  guint i;
 
-	if (version <= 2 && !tp_strdiff (variant, no_variant)) {
-		return g_strdup ("main.css");
-	}
+  if (version <= 2 && !tp_strdiff (variant, no_variant))
+    return g_strdup ("main.css");
 
-	variants = empathy_adium_info_get_available_variants (info);
-	if (variants->len == 0)
-		return g_strdup ("main.css");
+  variants = empathy_adium_info_get_available_variants (info);
+  if (variants->len == 0)
+    return g_strdup ("main.css");
 
-	/* Verify the variant exists, fallback to the first one */
-	for (i = 0; i < variants->len; i++) {
-		if (!tp_strdiff (variant, g_ptr_array_index (variants, i))) {
-			break;
-		}
-	}
-	if (i == variants->len) {
-		DEBUG ("Variant %s does not exist", variant);
-		variant = g_ptr_array_index (variants, 0);
-	}
+  /* Verify the variant exists, fallback to the first one */
+  for (i = 0; i < variants->len; i++)
+    {
+      if (!tp_strdiff (variant, g_ptr_array_index (variants, i)))
+        break;
+    }
+
+  if (i == variants->len)
+    {
+      DEBUG ("Variant %s does not exist", variant);
+      variant = g_ptr_array_index (variants, 0);
+    }
 
-	return g_strdup_printf ("Variants/%s.css", variant);
+  return g_strdup_printf ("Variants/%s.css", variant);
 
 }
 
 const gchar *
 empathy_adium_info_get_default_variant (GHashTable *info)
 {
-	if (adium_info_get_version (info) <= 2) {
-		return adium_info_get_no_variant_name (info);
-	}
+  if (adium_info_get_version (info) <= 2)
+    return adium_info_get_no_variant_name (info);
 
-	return tp_asv_get_string (info, "DefaultVariant");
+  return tp_asv_get_string (info, "DefaultVariant");
 }
 
 GPtrArray *
 empathy_adium_info_get_available_variants (GHashTable *info)
 {
-	GPtrArray *variants;
-	const gchar *path;
-	gchar *dirpath;
-	GDir *dir;
+  GPtrArray *variants;
+  const gchar *path;
+  gchar *dirpath;
+  GDir *dir;
 
-	variants = tp_asv_get_boxed (info, "AvailableVariants", G_TYPE_PTR_ARRAY);
-	if (variants != NULL) {
-		return variants;
-	}
+  variants = tp_asv_get_boxed (info, "AvailableVariants", G_TYPE_PTR_ARRAY);
+  if (variants != NULL)
+    return variants;
 
-	variants = g_ptr_array_new_with_free_func (g_free);
-	tp_asv_take_boxed (info, g_strdup ("AvailableVariants"),
-		G_TYPE_PTR_ARRAY, variants);
+  variants = g_ptr_array_new_with_free_func (g_free);
+  tp_asv_take_boxed (info, g_strdup ("AvailableVariants"),
+    G_TYPE_PTR_ARRAY, variants);
 
-	path = tp_asv_get_string (info, "path");
-	dirpath = g_build_filename (path, "Contents", "Resources", "Variants", NULL);
-	dir = g_dir_open (dirpath, 0, NULL);
-	if (dir != NULL) {
-		const gchar *name;
+  path = tp_asv_get_string (info, "path");
+  dirpath = g_build_filename (path, "Contents", "Resources", "Variants", NULL);
+  dir = g_dir_open (dirpath, 0, NULL);
+  if (dir != NULL)
+    {
+      const gchar *name;
 
-		for (name = g_dir_read_name (dir);
-		     name != NULL;
-		     name = g_dir_read_name (dir)) {
-			gchar *display_name;
+      for (name = g_dir_read_name (dir);
+           name != NULL;
+           name = g_dir_read_name (dir))
+        {
+          gchar *display_name;
 
-			if (!g_str_has_suffix (name, ".css")) {
-				continue;
-			}
+          if (!g_str_has_suffix (name, ".css"))
+            continue;
 
-			display_name = g_strdup (name);
-			strstr (display_name, ".css")[0] = '\0';
-			g_ptr_array_add (variants, display_name);
-		}
-		g_dir_close (dir);
-	}
-	g_free (dirpath);
+          display_name = g_strdup (name);
+          strstr (display_name, ".css")[0] = '\0';
+          g_ptr_array_add (variants, display_name);
+        }
 
-	if (adium_info_get_version (info) <= 2) {
-		g_ptr_array_add (variants,
-			g_strdup (adium_info_get_no_variant_name (info)));
-	}
+      g_dir_close (dir);
+    }
+  g_free (dirpath);
+
+  if (adium_info_get_version (info) <= 2)
+    g_ptr_array_add (variants,
+      g_strdup (adium_info_get_no_variant_name (info)));
 
-	return variants;
+  return variants;
 }
 
 GType
@@ -1884,202 +1988,213 @@ empathy_adium_data_get_type (void)
   return type_id;
 }
 
-EmpathyAdiumData  *
-empathy_adium_data_new_with_info (const gchar *path, GHashTable *info)
+EmpathyAdiumData *
+empathy_adium_data_new_with_info (const gchar *path,
+    GHashTable *info)
 {
-	EmpathyAdiumData *data;
-	gchar            *template_html = NULL;
-	gchar            *footer_html = NULL;
-	gchar            *tmp;
+  EmpathyAdiumData *data;
+  gchar *template_html = NULL;
+  gchar *footer_html = NULL;
+  gchar *tmp;
 
-	g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL);
+  g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL);
 
-	data = g_slice_new0 (EmpathyAdiumData);
-	data->ref_count = 1;
-	data->path = g_strdup (path);
-	data->basedir = g_strconcat (path, G_DIR_SEPARATOR_S "Contents"
-		G_DIR_SEPARATOR_S "Resources" G_DIR_SEPARATOR_S, NULL);
-	data->info = g_hash_table_ref (info);
-	data->version = adium_info_get_version (info);
-	data->strings_to_free = g_ptr_array_new_with_free_func (g_free);
-	data->date_format_cache = g_hash_table_new_full (g_str_hash,
-		g_str_equal, g_free, g_free);
+  data = g_slice_new0 (EmpathyAdiumData);
+  data->ref_count = 1;
+  data->path = g_strdup (path);
+  data->basedir = g_strconcat (path, G_DIR_SEPARATOR_S "Contents"
+    G_DIR_SEPARATOR_S "Resources" G_DIR_SEPARATOR_S, NULL);
+  data->info = g_hash_table_ref (info);
+  data->version = adium_info_get_version (info);
+  data->strings_to_free = g_ptr_array_new_with_free_func (g_free);
+  data->date_format_cache = g_hash_table_new_full (g_str_hash,
+    g_str_equal, g_free, g_free);
 
-	DEBUG ("Loading theme at %s", path);
+  DEBUG ("Loading theme at %s", path);
 
 #define LOAD(path, var) \
-		tmp = g_build_filename (data->basedir, path, NULL); \
-		g_file_get_contents (tmp, &var, NULL, NULL); \
-		g_free (tmp); \
+    tmp = g_build_filename (data->basedir, path, NULL); \
+    g_file_get_contents (tmp, &var, NULL, NULL); \
+    g_free (tmp); \
 
 #define LOAD_CONST(path, var) \
-	{ \
-		gchar *content; \
-		LOAD (path, content); \
-		if (content != NULL) { \
-			g_ptr_array_add (data->strings_to_free, content); \
-		} \
-		var = content; \
-	}
-
-	/* Load html files */
-	LOAD_CONST ("Content.html", data->content_html);
-	LOAD_CONST ("Incoming/Content.html", data->in_content_html);
-	LOAD_CONST ("Incoming/NextContent.html", data->in_nextcontent_html);
-	LOAD_CONST ("Incoming/Context.html", data->in_context_html);
-	LOAD_CONST ("Incoming/NextContext.html", data->in_nextcontext_html);
-	LOAD_CONST ("Outgoing/Content.html", data->out_content_html);
-	LOAD_CONST ("Outgoing/NextContent.html", data->out_nextcontent_html);
-	LOAD_CONST ("Outgoing/Context.html", data->out_context_html);
-	LOAD_CONST ("Outgoing/NextContext.html", data->out_nextcontext_html);
-	LOAD_CONST ("Status.html", data->status_html);
-	LOAD ("Template.html", template_html);
-	LOAD ("Footer.html", footer_html);
+  { \
+    gchar *content; \
+    LOAD (path, content); \
+    if (content != NULL) { \
+      g_ptr_array_add (data->strings_to_free, content); \
+    } \
+    var = content; \
+  }
+
+  /* Load html files */
+  LOAD_CONST ("Content.html", data->content_html);
+  LOAD_CONST ("Incoming/Content.html", data->in_content_html);
+  LOAD_CONST ("Incoming/NextContent.html", data->in_nextcontent_html);
+  LOAD_CONST ("Incoming/Context.html", data->in_context_html);
+  LOAD_CONST ("Incoming/NextContext.html", data->in_nextcontext_html);
+  LOAD_CONST ("Outgoing/Content.html", data->out_content_html);
+  LOAD_CONST ("Outgoing/NextContent.html", data->out_nextcontent_html);
+  LOAD_CONST ("Outgoing/Context.html", data->out_context_html);
+  LOAD_CONST ("Outgoing/NextContext.html", data->out_nextcontext_html);
+  LOAD_CONST ("Status.html", data->status_html);
+  LOAD ("Template.html", template_html);
+  LOAD ("Footer.html", footer_html);
 
 #undef LOAD_CONST
 #undef LOAD
 
-	/* HTML fallbacks: If we have at least content OR in_content, then
-	 * everything else gets a fallback */
+  /* HTML fallbacks: If we have at least content OR in_content, then
+   * everything else gets a fallback */
 
 #define FALLBACK(html, fallback) \
-	if (html == NULL) { \
-		html = fallback; \
-	}
+  if (html == NULL) { \
+    html = fallback; \
+  }
 
-	/* in_nextcontent -> in_content -> content */
-	FALLBACK (data->in_content_html,      data->content_html);
-	FALLBACK (data->in_nextcontent_html,  data->in_content_html);
+  /* in_nextcontent -> in_content -> content */
+  FALLBACK (data->in_content_html,      data->content_html);
+  FALLBACK (data->in_nextcontent_html,  data->in_content_html);
 
-	/* context -> content */
-	FALLBACK (data->in_context_html,      data->in_content_html);
-	FALLBACK (data->in_nextcontext_html,  data->in_nextcontent_html);
-	FALLBACK (data->out_context_html,     data->out_content_html);
-	FALLBACK (data->out_nextcontext_html, data->out_nextcontent_html);
+  /* context -> content */
+  FALLBACK (data->in_context_html,      data->in_content_html);
+  FALLBACK (data->in_nextcontext_html,  data->in_nextcontent_html);
+  FALLBACK (data->out_context_html,     data->out_content_html);
+  FALLBACK (data->out_nextcontext_html, data->out_nextcontent_html);
 
-	/* out -> in */
-	FALLBACK (data->out_content_html,     data->in_content_html);
-	FALLBACK (data->out_nextcontent_html, data->in_nextcontent_html);
-	FALLBACK (data->out_context_html,     data->in_context_html);
-	FALLBACK (data->out_nextcontext_html, data->in_nextcontext_html);
+  /* out -> in */
+  FALLBACK (data->out_content_html,     data->in_content_html);
+  FALLBACK (data->out_nextcontent_html, data->in_nextcontent_html);
+  FALLBACK (data->out_context_html,     data->in_context_html);
+  FALLBACK (data->out_nextcontext_html, data->in_nextcontext_html);
 
-	/* status -> in_content */
-	FALLBACK (data->status_html,          data->in_content_html);
+  /* status -> in_content */
+  FALLBACK (data->status_html,          data->in_content_html);
 
 #undef FALLBACK
 
-	/* template -> empathy's template */
-	data->custom_template = (template_html != NULL);
-	if (template_html == NULL) {
-		GError *error = NULL;
-
-		tmp = empathy_file_lookup ("Template.html", "data");
-
-		if (!g_file_get_contents (tmp, &template_html, NULL, &error)) {
-			g_warning ("couldn't load Empathy's default theme "
-				"template: %s", error->message);
-			g_return_val_if_reached (data);
-		}
-
-		g_free (tmp);
-	}
-
-	/* Default avatar */
-	tmp = g_build_filename (data->basedir, "Incoming", "buddy_icon.png", NULL);
-	if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-		data->default_incoming_avatar_filename = tmp;
-	} else {
-		g_free (tmp);
-	}
-	tmp = g_build_filename (data->basedir, "Outgoing", "buddy_icon.png", NULL);
-	if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-		data->default_outgoing_avatar_filename = tmp;
-	} else {
-		g_free (tmp);
-	}
-
-	/* Old custom templates had only 4 parameters.
-	 * New templates have 5 parameters */
-	if (data->version <= 2 && data->custom_template) {
-		tmp = string_with_format (template_html,
-			data->basedir,
-			"%@", /* Leave variant unset */
-			"", /* The header */
-			footer_html ? footer_html : "",
-			NULL);
-	} else {
-		tmp = string_with_format (template_html,
-			data->basedir,
-			data->version <= 2 ? "" : "@import url( \"main.css\" );",
-			"%@", /* Leave variant unset */
-			"", /* The header */
-			footer_html ? footer_html : "",
-			NULL);
-	}
-	g_ptr_array_add (data->strings_to_free, tmp);
-	data->template_html = tmp;
-
-	g_free (template_html);
-	g_free (footer_html);
-
-	return data;
-}
-
-EmpathyAdiumData  *
+  /* template -> empathy's template */
+  data->custom_template = (template_html != NULL);
+  if (template_html == NULL)
+    {
+      GError *error = NULL;
+
+      tmp = empathy_file_lookup ("Template.html", "data");
+
+      if (!g_file_get_contents (tmp, &template_html, NULL, &error)) {
+        g_warning ("couldn't load Empathy's default theme "
+          "template: %s", error->message);
+        g_return_val_if_reached (data);
+      }
+
+      g_free (tmp);
+    }
+
+  /* Default avatar */
+  tmp = g_build_filename (data->basedir, "Incoming", "buddy_icon.png", NULL);
+  if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+    {
+      data->default_incoming_avatar_filename = tmp;
+    }
+  else
+    {
+      g_free (tmp);
+    }
+
+  tmp = g_build_filename (data->basedir, "Outgoing", "buddy_icon.png", NULL);
+  if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+    {
+      data->default_outgoing_avatar_filename = tmp;
+    }
+  else
+    {
+      g_free (tmp);
+    }
+
+  /* Old custom templates had only 4 parameters.
+   * New templates have 5 parameters */
+  if (data->version <= 2 && data->custom_template)
+    {
+      tmp = string_with_format (template_html,
+        data->basedir,
+        "%@", /* Leave variant unset */
+        "", /* The header */
+        footer_html ? footer_html : "",
+        NULL);
+    }
+  else
+    {
+      tmp = string_with_format (template_html,
+        data->basedir,
+        data->version <= 2 ? "" : "@import url( \"main.css\" );",
+        "%@", /* Leave variant unset */
+        "", /* The header */
+        footer_html ? footer_html : "",
+        NULL);
+    }
+  g_ptr_array_add (data->strings_to_free, tmp);
+  data->template_html = tmp;
+
+  g_free (template_html);
+  g_free (footer_html);
+
+  return data;
+}
+
+EmpathyAdiumData *
 empathy_adium_data_new (const gchar *path)
 {
-	EmpathyAdiumData *data;
-	GHashTable *info;
+  EmpathyAdiumData *data;
+  GHashTable *info;
 
-	info = empathy_adium_info_new (path);
-	data = empathy_adium_data_new_with_info (path, info);
-	g_hash_table_unref (info);
+  info = empathy_adium_info_new (path);
+  data = empathy_adium_data_new_with_info (path, info);
+  g_hash_table_unref (info);
 
-	return data;
+  return data;
 }
 
-EmpathyAdiumData  *
+EmpathyAdiumData *
 empathy_adium_data_ref (EmpathyAdiumData *data)
 {
-	g_return_val_if_fail (data != NULL, NULL);
+  g_return_val_if_fail (data != NULL, NULL);
 
-	g_atomic_int_inc (&data->ref_count);
+  g_atomic_int_inc (&data->ref_count);
 
-	return data;
+  return data;
 }
 
 void
 empathy_adium_data_unref (EmpathyAdiumData *data)
 {
-	g_return_if_fail (data != NULL);
+  g_return_if_fail (data != NULL);
 
-	if (g_atomic_int_dec_and_test (&data->ref_count)) {
-		g_free (data->path);
-		g_free (data->basedir);
-		g_free (data->default_avatar_filename);
-		g_free (data->default_incoming_avatar_filename);
-		g_free (data->default_outgoing_avatar_filename);
-		g_hash_table_unref (data->info);
-		g_ptr_array_unref (data->strings_to_free);
-		tp_clear_pointer (&data->date_format_cache, g_hash_table_unref);
+  if (g_atomic_int_dec_and_test (&data->ref_count)) {
+    g_free (data->path);
+    g_free (data->basedir);
+    g_free (data->default_avatar_filename);
+    g_free (data->default_incoming_avatar_filename);
+    g_free (data->default_outgoing_avatar_filename);
+    g_hash_table_unref (data->info);
+    g_ptr_array_unref (data->strings_to_free);
+    tp_clear_pointer (&data->date_format_cache, g_hash_table_unref);
 
-		g_slice_free (EmpathyAdiumData, data);
-	}
+    g_slice_free (EmpathyAdiumData, data);
+  }
 }
 
 GHashTable *
 empathy_adium_data_get_info (EmpathyAdiumData *data)
 {
-	g_return_val_if_fail (data != NULL, NULL);
+  g_return_val_if_fail (data != NULL, NULL);
 
-	return data->info;
+  return data->info;
 }
 
 const gchar *
 empathy_adium_data_get_path (EmpathyAdiumData *data)
 {
-	g_return_val_if_fail (data != NULL, NULL);
+  g_return_val_if_fail (data != NULL, NULL);
 
-	return data->path;
+  return data->path;
 }
-
diff --git a/libempathy-gtk/empathy-theme-adium.h b/libempathy-gtk/empathy-theme-adium.h
index 6f7573b..ac82025 100644
--- a/libempathy-gtk/empathy-theme-adium.h
+++ b/libempathy-gtk/empathy-theme-adium.h
@@ -1,6 +1,5 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * Copyright (C) 2008-2009 Collabora Ltd.
+ * Copyright (C) 2008-2012 Collabora Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,49 +27,70 @@
 
 G_BEGIN_DECLS
 
-#define EMPATHY_TYPE_THEME_ADIUM         (empathy_theme_adium_get_type ())
-#define EMPATHY_THEME_ADIUM(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_THEME_ADIUM, EmpathyThemeAdium))
-#define EMPATHY_THEME_ADIUM_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_THEME_ADIUM, EmpathyThemeAdiumClass))
-#define EMPATHY_IS_THEME_ADIUM(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_THEME_ADIUM))
-#define EMPATHY_IS_THEME_ADIUM_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_THEME_ADIUM))
-#define EMPATHY_THEME_ADIUM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_THEME_ADIUM, EmpathyThemeAdiumClass))
+/* TYPE MACROS */
+#define EMPATHY_TYPE_THEME_ADIUM \
+  (empathy_theme_adium_get_type ())
+#define EMPATHY_THEME_ADIUM(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), \
+    EMPATHY_TYPE_THEME_ADIUM, \
+    EmpathyThemeAdium))
+#define EMPATHY_THEME_ADIUM_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), \
+    EMPATHY_TYPE_THEME_ADIUM, \
+    EmpathyThemeAdiumClass))
+#define EMPATHY_IS_THEME_ADIUM(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), \
+    EMPATHY_TYPE_THEME_ADIUM))
+#define EMPATHY_IS_THEME_ADIUM_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), \
+    EMPATHY_TYPE_THEME_ADIUM))
+#define EMPATHY_THEME_ADIUM_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+    EMPATHY_TYPE_THEME_ADIUM, \
+    EmpathyThemeAdiumClass))
 
-typedef struct _EmpathyThemeAdium      EmpathyThemeAdium;
+
+
+typedef struct _EmpathyThemeAdium EmpathyThemeAdium;
 typedef struct _EmpathyThemeAdiumClass EmpathyThemeAdiumClass;
-typedef struct _EmpathyAdiumData       EmpathyAdiumData;
+typedef struct _EmpathyAdiumData EmpathyAdiumData;
 
-struct _EmpathyThemeAdium {
-	WebKitWebView parent;
-	gpointer priv;
+struct _EmpathyThemeAdium
+{
+  WebKitWebView parent;
+  gpointer priv;
 };
 
-struct _EmpathyThemeAdiumClass {
-	WebKitWebViewClass parent_class;
+struct _EmpathyThemeAdiumClass
+{
+  WebKitWebViewClass parent_class;
 };
 
-GType              empathy_theme_adium_get_type (void) G_GNUC_CONST;
-EmpathyThemeAdium *empathy_theme_adium_new      (EmpathyAdiumData *data,
-						 const gchar *variant);
-void               empathy_theme_adium_set_variant (EmpathyThemeAdium *theme,
-						    const gchar *variant);
-void               empathy_theme_adium_show_inspector (EmpathyThemeAdium *theme);
+GType empathy_theme_adium_get_type (void) G_GNUC_CONST;
 
-gboolean           empathy_adium_path_is_valid (const gchar *path);
+EmpathyThemeAdium *empathy_theme_adium_new (EmpathyAdiumData *data,
+    const gchar *variant);
+void empathy_theme_adium_set_variant (EmpathyThemeAdium *theme,
+                const gchar *variant);
+void empathy_theme_adium_show_inspector (EmpathyThemeAdium *theme);
 
-GHashTable        *empathy_adium_info_new (const gchar *path);
-const gchar *      empathy_adium_info_get_default_variant (GHashTable *info);
-GPtrArray *        empathy_adium_info_get_available_variants (GHashTable *info);
+/* not methods functions */
 
-#define EMPATHY_TYPE_ADIUM_DATA (empathy_adium_data_get_type ())
-GType              empathy_adium_data_get_type (void) G_GNUC_CONST;
-EmpathyAdiumData  *empathy_adium_data_new (const gchar *path);
-EmpathyAdiumData  *empathy_adium_data_new_with_info (const gchar *path,
-						     GHashTable *info);
-EmpathyAdiumData  *empathy_adium_data_ref (EmpathyAdiumData *data);
-void               empathy_adium_data_unref (EmpathyAdiumData *data);
-GHashTable        *empathy_adium_data_get_info (EmpathyAdiumData *data);
-const gchar       *empathy_adium_data_get_path (EmpathyAdiumData *data);
+gboolean empathy_adium_path_is_valid (const gchar *path);
 
+GHashTable *empathy_adium_info_new (const gchar *path);
+const gchar * empathy_adium_info_get_default_variant (GHashTable *info);
+GPtrArray * empathy_adium_info_get_available_variants (GHashTable *info);
+
+#define EMPATHY_TYPE_ADIUM_DATA (empathy_adium_data_get_type ())
+GType empathy_adium_data_get_type (void) G_GNUC_CONST;
+EmpathyAdiumData *empathy_adium_data_new (const gchar *path);
+EmpathyAdiumData *empathy_adium_data_new_with_info (const gchar *path,
+    GHashTable *info);
+EmpathyAdiumData *empathy_adium_data_ref (EmpathyAdiumData *data);
+void empathy_adium_data_unref (EmpathyAdiumData *data);
+GHashTable *empathy_adium_data_get_info (EmpathyAdiumData *data);
+const gchar *empathy_adium_data_get_path (EmpathyAdiumData *data);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]