]> git.0d.be Git - empathy.git/blobdiff - src/empathy-debug-window.c
Merge branch 'gnome-3-8'
[empathy.git] / src / empathy-debug-window.c
index f64ebabdd386983d7f976c5d251e2c4f2e20cd4f..e4f5e21d646b2f00b41abb7289445604267d299d 100644 (file)
 */
 
 #include "config.h"
-
-#include <string.h>
+#include "empathy-debug-window.h"
 
 #include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gio/gio.h>
-#include <gdk/gdkkeysyms.h>
 #include <libsoup/soup.h>
+#include <tp-account-widgets/tpaw-utils.h>
 
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
-#include <libempathy/empathy-utils.h>
-
-#include <libempathy-gtk/empathy-account-chooser.h>
-#include <libempathy-gtk/empathy-geometry.h>
-#include <libempathy-gtk/empathy-ui-utils.h>
-
-#include <telepathy-glib/dbus.h>
-#include <telepathy-glib/interfaces.h>
-#include <telepathy-glib/util.h>
-#include <telepathy-glib/proxy-subclass.h>
-#include <telepathy-glib/account-manager.h>
+#include "empathy-geometry.h"
+#include "empathy-ui-utils.h"
+#include "empathy-utils.h"
 
-#include "extensions/extensions.h"
-
-#include "empathy-debug-window.h"
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include "empathy-debug.h"
 
 G_DEFINE_TYPE (EmpathyDebugWindow, empathy_debug_window,
     GTK_TYPE_WINDOW)
@@ -58,12 +44,7 @@ typedef enum
 
 enum
 {
-  COL_DEBUG_TIMESTAMP = 0,
-  COL_DEBUG_DOMAIN,
-  COL_DEBUG_CATEGORY,
-  COL_DEBUG_LEVEL_STRING,
-  COL_DEBUG_MESSAGE,
-  COL_DEBUG_LEVEL_VALUE,
+  COL_DEBUG_MESSAGE = 0,
   NUM_DEBUG_COLS
 };
 
@@ -181,52 +162,28 @@ copy_buffered_messages (GtkTreeModel *buffer,
 {
   GtkListStore *active_buffer = data;
   GtkTreeIter active_buffer_iter;
-  gdouble timestamp;
-  gchar *domain, *category, *message, *level_string;
-  guint level;
+  TpDebugMessage *msg;
 
   gtk_tree_model_get (buffer, iter,
-      COL_DEBUG_TIMESTAMP, &timestamp,
-      COL_DEBUG_DOMAIN, &domain,
-      COL_DEBUG_CATEGORY, &category,
-      COL_DEBUG_LEVEL_STRING, &level_string,
-      COL_DEBUG_MESSAGE, &message,
-      COL_DEBUG_LEVEL_VALUE, &level,
+      COL_DEBUG_MESSAGE, &msg,
       -1);
   gtk_list_store_insert_with_values (active_buffer, &active_buffer_iter, -1,
-      COL_DEBUG_TIMESTAMP, timestamp,
-      COL_DEBUG_DOMAIN, domain,
-      COL_DEBUG_CATEGORY, category,
-      COL_DEBUG_LEVEL_STRING, level_string,
-      COL_DEBUG_MESSAGE, message,
-      COL_DEBUG_LEVEL_VALUE, level,
+      COL_DEBUG_MESSAGE, msg,
       -1);
 
-  g_free (domain);
-  g_free (category);
-  g_free (level_string);
-  g_free (message);
+  g_object_unref (msg);
 
   return FALSE;
 }
 
 static void
 insert_values_in_buffer (GtkListStore *store,
-        gdouble timestamp,
-        const gchar *domain,
-        const gchar *category,
-        GLogLevelFlags level,
-        const gchar *string)
+    TpDebugMessage *msg)
 {
   GtkTreeIter iter;
 
   gtk_list_store_insert_with_values (store, &iter, -1,
-      COL_DEBUG_TIMESTAMP, timestamp,
-      COL_DEBUG_DOMAIN, domain,
-      COL_DEBUG_CATEGORY, category,
-      COL_DEBUG_LEVEL_STRING, log_level_to_string (level),
-      COL_DEBUG_MESSAGE, string,
-      COL_DEBUG_LEVEL_VALUE, level,
+      COL_DEBUG_MESSAGE, msg,
       -1);
 }
 
@@ -235,64 +192,22 @@ debug_window_add_message (EmpathyDebugWindow *self,
     TpDebugClient *debug,
     TpDebugMessage *msg)
 {
-  gchar *domain, *category;
-  gchar *string;
   GtkListStore *active_buffer, *pause_buffer;
-  gdouble timestamp;
-  const gchar *domain_category, *message;
-  GLogLevelFlags level;
-  GDateTime *t;
-
-  t = tp_debug_message_get_time (msg);
-  /* FIME: we loose the microseconds */
-  timestamp = (gdouble) g_date_time_to_unix (t);
-
-  domain_category = tp_debug_message_get_domain (msg);
-  level = tp_debug_message_get_level (msg);
-  message = tp_debug_message_get_message (msg);
-
-  if (g_strrstr (domain_category, "/"))
-    {
-      gchar **parts = g_strsplit (domain_category, "/", 2);
-      domain = g_strdup (parts[0]);
-      category = g_strdup (parts[1]);
-      g_strfreev (parts);
-    }
-  else
-    {
-      domain = g_strdup (domain_category);
-      category = g_strdup ("");
-    }
-
-  if (g_str_has_suffix (message, "\n"))
-    string = g_strchomp (g_strdup (message));
-  else
-    string = g_strdup (message);
 
   pause_buffer = g_object_get_data (G_OBJECT (debug), "pause-buffer");
   active_buffer = g_object_get_data (G_OBJECT (debug), "active-buffer");
 
   if (self->priv->paused)
     {
-      insert_values_in_buffer (pause_buffer, timestamp,
-          domain, category, level,
-          string);
+      insert_values_in_buffer (pause_buffer, msg);
     }
   else
     {
       /* Append 'this' message to this service's and All's active-buffers */
-      insert_values_in_buffer (active_buffer, timestamp,
-          domain, category, level,
-          string);
+      insert_values_in_buffer (active_buffer, msg);
 
-      insert_values_in_buffer (self->priv->all_active_buffer, timestamp,
-          domain, category, level,
-          string);
+      insert_values_in_buffer (self->priv->all_active_buffer, msg);
     }
-
-  g_free (string);
-  g_free (domain);
-  g_free (category);
 }
 
 static void
@@ -461,7 +376,7 @@ debug_window_get_messages_cb (GObject *object,
   messages = tp_debug_client_get_messages_finish (debug, result, &error);
   if (messages == NULL)
     {
-      DEBUG ("Failed to get debug messsages: %s", error->message);
+      DEBUG ("Failed to get debug messages: %s", error->message);
       g_error_free (error);
 
       /* We want to set the window sensitivity to false only when proxy for the
@@ -495,6 +410,7 @@ debug_window_get_messages_cb (GObject *object,
           COL_PROXY, debug,
           -1);
     }
+  g_ptr_array_unref (messages);
 
   g_free (proxy_service_name);
 
@@ -585,12 +501,7 @@ static GtkListStore *
 new_list_store_for_service (void)
 {
   return gtk_list_store_new (NUM_DEBUG_COLS,
-             G_TYPE_DOUBLE, /* COL_DEBUG_TIMESTAMP */
-             G_TYPE_STRING, /* COL_DEBUG_DOMAIN */
-             G_TYPE_STRING, /* COL_DEBUG_CATEGORY */
-             G_TYPE_STRING, /* COL_DEBUG_LEVEL_STRING */
-             G_TYPE_STRING, /* COL_DEBUG_MESSAGE */
-             G_TYPE_UINT);  /* COL_DEBUG_LEVEL_VALUE */
+             TP_TYPE_DEBUG_MESSAGE); /* COL_DEBUG_MESSAGE */
 }
 
 static gboolean
@@ -599,23 +510,25 @@ debug_window_visible_func (GtkTreeModel *model,
     gpointer user_data)
 {
   EmpathyDebugWindow *self = user_data;
-  guint filter_value, level;
+  GLogLevelFlags filter_value;
   GtkTreeModel *filter_model;
   GtkTreeIter filter_iter;
+  TpDebugMessage *msg;
+  gboolean result;
 
   filter_model = gtk_combo_box_get_model (
       GTK_COMBO_BOX (self->priv->level_filter));
   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->priv->level_filter),
       &filter_iter);
 
-  gtk_tree_model_get (model, iter, COL_DEBUG_LEVEL_VALUE, &level, -1);
+  gtk_tree_model_get (model, iter, COL_DEBUG_MESSAGE, &msg, -1);
   gtk_tree_model_get (filter_model, &filter_iter,
       COL_LEVEL_VALUE, &filter_value, -1);
 
-  if (level <= filter_value)
-    return TRUE;
+  result = (tp_debug_message_get_level (msg) <= filter_value);
+  g_object_unref (msg);
 
-  return FALSE;
+  return result;
 }
 
 static gboolean
@@ -869,21 +782,21 @@ get_cm_display_name (EmpathyDebugWindow *self,
   GList *accounts, *ptr;
   char *retval;
 
-  accounts = tp_account_manager_get_valid_accounts (self->priv->am);
+  accounts = tp_account_manager_dup_valid_accounts (self->priv->am);
 
   for (ptr = accounts; ptr != NULL; ptr = ptr->next)
     {
       TpAccount *account = TP_ACCOUNT (ptr->data);
 
-      if (!tp_strdiff (tp_account_get_connection_manager (account), cm_name))
+      if (!tp_strdiff (tp_account_get_cm_name (account), cm_name))
         {
           g_hash_table_insert (protocols,
-              (char *) tp_account_get_protocol (account),
+              (char *) tp_account_get_protocol_name (account),
               GUINT_TO_POINTER (TRUE));
         }
     }
 
-  g_list_free (accounts);
+  g_list_free_full (accounts, g_object_unref);
 
   if (g_hash_table_size (protocols) > 0)
     {
@@ -1093,7 +1006,7 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy,
       return;
     }
 
-  if (EMP_STR_EMPTY (arg1) && !EMP_STR_EMPTY (arg2))
+  if (TPAW_STR_EMPTY (arg1) && !TPAW_STR_EMPTY (arg2))
     {
       GtkTreeIter *found_at_iter = NULL;
       gchar *display_name;
@@ -1173,7 +1086,7 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy,
 
       g_free (display_name);
     }
-  else if (!EMP_STR_EMPTY (arg1) && EMP_STR_EMPTY (arg2))
+  else if (!TPAW_STR_EMPTY (arg1) && TPAW_STR_EMPTY (arg2))
     {
       /* A service died */
       GtkTreeIter *iter = NULL;
@@ -1364,7 +1277,8 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item,
   GtkTreePath *path;
   GtkTreeViewColumn *focus_column;
   GtkTreeIter iter;
-  gchar *message;
+  TpDebugMessage *msg;
+  const gchar *message;
   GtkClipboard *clipboard;
 
   gtk_tree_view_get_cursor (GTK_TREE_VIEW (self->priv->view),
@@ -1379,10 +1293,12 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item,
   gtk_tree_model_get_iter (self->priv->store_filter, &iter, path);
 
   gtk_tree_model_get (self->priv->store_filter, &iter,
-      COL_DEBUG_MESSAGE, &message,
+      COL_DEBUG_MESSAGE, &msg,
       -1);
 
-  if (EMP_STR_EMPTY (message))
+  message = tp_debug_message_get_message (msg);
+
+  if (TPAW_STR_EMPTY (message))
     {
       DEBUG ("Log message is empty");
       return;
@@ -1394,7 +1310,7 @@ debug_window_menu_copy_activate_cb (GtkMenuItem *menu_item,
 
   gtk_clipboard_set_text (clipboard, message, -1);
 
-  g_free (message);
+  g_object_unref (msg);
 }
 
 typedef struct
@@ -1452,25 +1368,20 @@ debug_window_button_press_event_cb (GtkTreeView *view,
 }
 
 static gchar *
-debug_window_format_timestamp (gdouble timestamp)
+debug_window_format_timestamp (TpDebugMessage *msg)
 {
-  struct tm *tstruct;
-  char time_str[32];
+  GDateTime *t;
+  gchar *time_str, *text;
   gint ms;
-  time_t sec;
-  gchar *text;
 
-  ms = (int) ((timestamp - (int) timestamp)*1e6);
-  sec = (long) timestamp;
-  tstruct = localtime ((time_t *) &sec);
-  if (!strftime (time_str, sizeof (time_str), "%x %T", tstruct))
-    {
-      DEBUG ("Failed to format timestamp: %e", timestamp);
-      time_str[0] = '\0';
-    }
+  t = tp_debug_message_get_time (msg);
+
+  time_str = g_date_time_format (t, "%x %T");
 
+  ms = g_date_time_get_microsecond (t);
   text = g_strdup_printf ("%s.%d", time_str, ms);
 
+  g_free (time_str);
   return text;
 }
 
@@ -1481,62 +1392,131 @@ debug_window_time_formatter (GtkTreeViewColumn *tree_column,
     GtkTreeIter *iter,
     gpointer data)
 {
-  gdouble timestamp;
+  TpDebugMessage *msg;
   gchar *time_str;
 
-  gtk_tree_model_get (tree_model, iter, COL_DEBUG_TIMESTAMP, &timestamp, -1);
+  gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1);
 
-  time_str = debug_window_format_timestamp (timestamp);
+  time_str = debug_window_format_timestamp (msg);
 
   g_object_set (G_OBJECT (cell), "text", time_str, NULL);
 
-  g_free (time_str);
+  g_object_unref (msg);
+}
+
+static void
+debug_window_domain_formatter (GtkTreeViewColumn *tree_column,
+    GtkCellRenderer *cell,
+    GtkTreeModel *tree_model,
+    GtkTreeIter *iter,
+    gpointer data)
+{
+  TpDebugMessage *msg;
+
+  gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1);
+
+  g_object_set (G_OBJECT (cell), "text", tp_debug_message_get_domain (msg),
+      NULL);
+
+  g_object_unref (msg);
+}
+
+static void
+debug_window_category_formatter (GtkTreeViewColumn *tree_column,
+    GtkCellRenderer *cell,
+    GtkTreeModel *tree_model,
+    GtkTreeIter *iter,
+    gpointer data)
+{
+  TpDebugMessage *msg;
+  const gchar *category;
+
+  gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1);
+
+  category = tp_debug_message_get_category (msg);
+
+  g_object_set (G_OBJECT (cell), "text", category ? category : "", NULL);
+
+  g_object_unref (msg);
+}
+
+static void
+debug_window_message_formatter (GtkTreeViewColumn *tree_column,
+    GtkCellRenderer *cell,
+    GtkTreeModel *tree_model,
+    GtkTreeIter *iter,
+    gpointer data)
+{
+  TpDebugMessage *msg;
+
+  gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1);
+
+  g_object_set (G_OBJECT (cell), "text",
+      tp_debug_message_get_message (msg), NULL);
+
+  g_object_unref (msg);
+}
+
+static void
+debug_window_level_formatter (GtkTreeViewColumn *tree_column,
+    GtkCellRenderer *cell,
+    GtkTreeModel *tree_model,
+    GtkTreeIter *iter,
+    gpointer data)
+{
+  TpDebugMessage *msg;
+  const gchar *level;
+
+  gtk_tree_model_get (tree_model, iter, COL_DEBUG_MESSAGE, &msg, -1);
+
+  level = log_level_to_string (tp_debug_message_get_level (msg));
+
+  g_object_set (G_OBJECT (cell), "text", level, NULL);
+
+  g_object_unref (msg);
 }
 
 static gboolean
-debug_window_store_filter_foreach (GtkTreeModel *model,
+debug_window_copy_model_foreach (GtkTreeModel *model,
     GtkTreePath *path,
     GtkTreeIter *iter,
     gpointer user_data)
 {
-  gchar **debug_data = (gchar **)user_data;
-  gchar *domain, *category, *message, *level_str, *level_upper;
-  gdouble timestamp;
-  gchar *line, *time_str, *tmp;
+  gchar **text = (gchar **) user_data;
+  gchar *tmp;
+  gchar *level_upper;
+  const gchar *level_str, *category;
+  gchar *line, *time_str;
+  TpDebugMessage *msg;
+
+  if (*text == NULL)
+    *text = g_strdup ("");
 
   gtk_tree_model_get (model, iter,
-      COL_DEBUG_TIMESTAMP, &timestamp,
-      COL_DEBUG_DOMAIN, &domain,
-      COL_DEBUG_CATEGORY, &category,
-      COL_DEBUG_LEVEL_STRING, &level_str,
-      COL_DEBUG_MESSAGE, &message,
+      COL_DEBUG_MESSAGE, &msg,
       -1);
 
+  level_str = log_level_to_string (tp_debug_message_get_level (msg));
   level_upper = g_ascii_strup (level_str, -1);
 
-  time_str = debug_window_format_timestamp (timestamp);
+  time_str = debug_window_format_timestamp (msg);
+  category = tp_debug_message_get_category (msg);
 
   line = g_strdup_printf ("%s%s%s-%s: %s: %s\n",
-      domain, EMP_STR_EMPTY (category) ? "" : "/",
-      category, level_upper, time_str, message);
+      tp_debug_message_get_domain (msg),
+      category ? "" : "/", category ? category : "",
+      level_upper, time_str, tp_debug_message_get_message (msg));
 
   g_free (time_str);
 
-  /* Compact all message lines in the out parameter debug_data */
-  if (!tp_str_empty (*debug_data))
-    tmp = g_strconcat (*debug_data, line, NULL);
-  else
-    tmp = g_strdup (line);
-
-  g_free (*debug_data);
-  *debug_data = tmp;
+  tmp = g_strconcat (*text, line, NULL);
 
+  g_free (*text);
   g_free (line);
   g_free (level_upper);
-  g_free (level_str);
-  g_free (domain);
-  g_free (category);
-  g_free (message);
+  g_object_unref (msg);
+
+  *text = tmp;
 
   return FALSE;
 }
@@ -1572,7 +1552,7 @@ debug_window_save_file_chooser_response_cb (GtkDialog *dialog,
     }
 
   gtk_tree_model_foreach (self->priv->store_filter,
-      debug_window_store_filter_foreach, &debug_data);
+      debug_window_copy_model_foreach, &debug_data);
 
   g_output_stream_write (G_OUTPUT_STREAM (output_stream), debug_data,
       strlen (debug_data), NULL, &file_write_error);
@@ -1766,65 +1746,18 @@ debug_window_send_to_pastebin_cb (GtkToolButton *tool_button,
   DEBUG ("Preparing debug data for sending to pastebin.");
 
   gtk_tree_model_foreach (self->priv->store_filter,
-      debug_window_store_filter_foreach, &debug_data);
+      debug_window_copy_model_foreach, &debug_data);
 
   debug_window_send_to_pastebin (self, debug_data);
   g_free (debug_data);
 }
 
-static gboolean
-debug_window_copy_model_foreach (GtkTreeModel *model,
-    GtkTreePath *path,
-    GtkTreeIter *iter,
-    gpointer user_data)
-{
-  gchar **text = (gchar **) user_data;
-  gchar *tmp;
-  gchar *domain, *category, *message, *level_str, *level_upper;
-  gdouble timestamp;
-  gchar *line, *time_str;
-
-  gtk_tree_model_get (model, iter,
-      COL_DEBUG_TIMESTAMP, &timestamp,
-      COL_DEBUG_DOMAIN, &domain,
-      COL_DEBUG_CATEGORY, &category,
-      COL_DEBUG_LEVEL_STRING, &level_str,
-      COL_DEBUG_MESSAGE, &message,
-      -1);
-
-  level_upper = g_ascii_strup (level_str, -1);
-
-  time_str = debug_window_format_timestamp (timestamp);
-
-  line = g_strdup_printf ("%s%s%s-%s: %s: %s\n",
-      domain, EMP_STR_EMPTY (category) ? "" : "/",
-      category, level_upper, time_str, message);
-
-  g_free (time_str);
-
-  tmp = g_strconcat (*text, line, NULL);
-
-  g_free (*text);
-  g_free (line);
-  g_free (level_upper);
-  g_free (level_str);
-  g_free (domain);
-  g_free (category);
-  g_free (message);
-
-  *text = tmp;
-
-  return FALSE;
-}
-
 static void
 debug_window_copy_clicked_cb (GtkToolButton *tool_button,
     EmpathyDebugWindow *self)
 {
   GtkClipboard *clipboard;
-  gchar *text;
-
-  text = g_strdup ("");
+  gchar *text = NULL;
 
   gtk_tree_model_foreach (self->priv->store_filter,
       debug_window_copy_model_foreach, &text);
@@ -1902,6 +1835,7 @@ am_prepared_cb (GObject *am,
   GtkListStore *level_store;
   GtkTreeIter iter;
   GError *error = NULL;
+  GtkWidget *infobar, *content;
 
   if (!tp_proxy_prepare_finish (am, res, &error))
     {
@@ -1909,6 +1843,8 @@ am_prepared_cb (GObject *am,
       g_clear_error (&error);
     }
 
+  empathy_set_css_provider (GTK_WIDGET (object));
+
   gtk_window_set_title (GTK_WINDOW (object), _("Debug Window"));
   gtk_window_set_default_size (GTK_WINDOW (object), 800, 400);
   empathy_geometry_bind (GTK_WINDOW (object), "debug-window");
@@ -2077,6 +2013,32 @@ am_prepared_cb (GObject *am,
   g_signal_connect (self->priv->level_filter, "changed",
       G_CALLBACK (debug_window_filter_changed_cb), object);
 
+  /* Info bar */
+  infobar = gtk_info_bar_new ();
+  gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
+
+  label = gtk_label_new (
+        _("Even if they don't display passwords, logs can contain sensitive "
+          "information such as your list of contacts or the messages you "
+          "recently sent or received.\nIf you don't want to see such "
+          "information available in a public bug report, you "
+          "can choose to limit the visibility of your bug to "
+          "Empathy developers when reporting it by displaying "
+          "the advanced fields in the "
+          "<a href=\"https://bugzilla.gnome.org/enter_bug.cgi?product=empathy\">"
+          "bug report</a>."));
+  gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_style_context_add_class (gtk_widget_get_style_context (label),
+      GTK_STYLE_CLASS_DIM_LABEL);
+
+  content = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar));
+  gtk_box_pack_start (GTK_BOX (content), label, FALSE, FALSE, 0);
+
+  gtk_widget_show (infobar);
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (vbox), infobar, FALSE, FALSE, 0);
+
   /* Debug treeview */
   self->priv->view = gtk_tree_view_new ();
   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (self->priv->view), TRUE);
@@ -2085,22 +2047,31 @@ am_prepared_cb (GObject *am,
       G_CALLBACK (debug_window_button_press_event_cb), object);
 
   renderer = gtk_cell_renderer_text_new ();
-  g_object_set (renderer, "yalign", 0, NULL);
+  g_object_set (renderer, "yalign", (gfloat) 0, NULL);
 
   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view),
       -1, _("Time"), renderer,
       (GtkTreeCellDataFunc) debug_window_time_formatter, NULL, NULL);
-  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view),
-      -1, _("Domain"), renderer, "text", COL_DEBUG_DOMAIN, NULL);
-  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view),
-      -1, _("Category"), renderer, "text", COL_DEBUG_CATEGORY, NULL);
-  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view),
-      -1, _("Level"), renderer, "text", COL_DEBUG_LEVEL_STRING, NULL);
+  gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view),
+      -1, _("Domain"), renderer,
+      (GtkTreeCellDataFunc) debug_window_domain_formatter, NULL, NULL);
+  gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view),
+      -1, _("Category"), renderer,
+      (GtkTreeCellDataFunc) debug_window_category_formatter, NULL, NULL);
+  gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view),
+      -1, _("Level"), renderer,
+      (GtkTreeCellDataFunc) debug_window_level_formatter, NULL, NULL);
 
   renderer = gtk_cell_renderer_text_new ();
-  g_object_set (renderer, "family", "Monospace", NULL);
-  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (self->priv->view),
-      -1, _("Message"), renderer, "text", COL_DEBUG_MESSAGE, NULL);
+
+  g_object_set (renderer,
+      "family", "Monospace",
+      "ellipsize", PANGO_ELLIPSIZE_END,
+      NULL);
+
+  gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (self->priv->view),
+      -1, _("Message"), renderer,
+      (GtkTreeCellDataFunc) debug_window_message_formatter, NULL, NULL);
 
   self->priv->store_filter = NULL;