X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-debug-window.c;h=3aa8c1502f7a5b15dc347b90419b4dfef891ec39;hp=9f262a62fcaa9b673f82f5197588e6aab6b2a4c7;hb=1a35f5897e424a4e2273f64f428a798e0812f76f;hpb=bb003c5d228051e1a55e401fc024ffd58eeeabb4 diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c index 9f262a62..3aa8c150 100644 --- a/src/empathy-debug-window.c +++ b/src/empathy-debug-window.c @@ -111,12 +111,17 @@ typedef struct /* Service (CM, Client) chooser store */ GtkListStore *service_store; + /* Counters on services detected and added */ + guint services_detected; + guint name_owner_cb_count; + /* Debug to show upon creation */ gchar *select_name; /* Misc. */ gboolean dispose_run; TpAccountManager *am; + GtkListStore *all_active_buffer; } EmpathyDebugWindowPriv; static const gchar * @@ -165,7 +170,7 @@ get_active_service_name (EmpathyDebugWindow *self) } static gboolean -flush_buffered_messages_to_list_store (GtkTreeModel *pause_buffer, +copy_buffered_messages (GtkTreeModel *buffer, GtkTreePath *path, GtkTreeIter *iter, gpointer data) @@ -176,7 +181,7 @@ flush_buffered_messages_to_list_store (GtkTreeModel *pause_buffer, gchar *domain, *category, *message, *level_string; guint level; - gtk_tree_model_get (pause_buffer, iter, + gtk_tree_model_get (buffer, iter, COL_DEBUG_TIMESTAMP, ×tamp, COL_DEBUG_DOMAIN, &domain, COL_DEBUG_CATEGORY, &category, @@ -184,8 +189,7 @@ flush_buffered_messages_to_list_store (GtkTreeModel *pause_buffer, COL_DEBUG_MESSAGE, &message, COL_DEBUG_LEVEL_VALUE, &level, -1); - gtk_list_store_append (active_buffer, &active_buffer_iter); - gtk_list_store_set (active_buffer, &active_buffer_iter, + gtk_list_store_insert_with_values (active_buffer, &active_buffer_iter, -1, COL_DEBUG_TIMESTAMP, timestamp, COL_DEBUG_DOMAIN, domain, COL_DEBUG_CATEGORY, category, @@ -202,6 +206,26 @@ flush_buffered_messages_to_list_store (GtkTreeModel *pause_buffer, return FALSE; } +static void +insert_values_in_buffer (GtkListStore *store, + gdouble timestamp, + const gchar *domain, + const gchar *category, + guint level, + const gchar *string) +{ + 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, + -1); +} + static void debug_window_add_message (EmpathyDebugWindow *debug_window, TpProxy *proxy, @@ -212,7 +236,6 @@ debug_window_add_message (EmpathyDebugWindow *debug_window, { EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); gchar *domain, *category; - GtkTreeIter iter; gchar *string; GtkListStore *active_buffer, *pause_buffer; @@ -237,16 +260,23 @@ debug_window_add_message (EmpathyDebugWindow *debug_window, pause_buffer = g_object_get_data (G_OBJECT (proxy), "pause-buffer"); active_buffer = g_object_get_data (G_OBJECT (proxy), "active-buffer"); - gtk_list_store_append (priv->paused ? pause_buffer : active_buffer, - &iter); - gtk_list_store_set (priv->paused ? pause_buffer : active_buffer, &iter, - 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, - -1); + if (priv->paused) + { + insert_values_in_buffer (pause_buffer, timestamp, + domain, category, level, + string); + } + 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 (priv->all_active_buffer, timestamp, + domain, category, level, + string); + } g_free (string); g_free (domain); @@ -316,6 +346,38 @@ debug_window_set_toolbar_sensitivity (EmpathyDebugWindow *debug_window, } } +static gboolean +debug_window_get_iter_for_active_buffer (GtkListStore *active_buffer, + GtkTreeIter *iter, + EmpathyDebugWindow *debug_window) +{ + EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); + gboolean valid_iter; + GtkTreeModel *model = GTK_TREE_MODEL (priv->service_store); + + gtk_tree_model_get_iter_first (model, iter); + for (valid_iter = gtk_tree_model_iter_next (model, iter); + valid_iter; + valid_iter = gtk_tree_model_iter_next (model, iter)) + { + GtkListStore *stored_active_buffer; + + gtk_tree_model_get (model, iter, + COL_ACTIVE_BUFFER, &stored_active_buffer, + -1); + if (active_buffer == stored_active_buffer) + { + g_object_unref (stored_active_buffer); + return valid_iter; + } + g_object_unref (stored_active_buffer); + } + + return valid_iter; +} + +static void refresh_all_buffer (EmpathyDebugWindow *debug_window); + static void proxy_invalidated_cb (TpProxy *proxy, guint domain, @@ -323,8 +385,33 @@ proxy_invalidated_cb (TpProxy *proxy, gchar *msg, gpointer user_data) { - /* Proxy has been invalidated so we destroy it */ - tp_clear_object (&proxy); + EmpathyDebugWindow *self = (EmpathyDebugWindow *) user_data; + EmpathyDebugWindowPriv *priv = GET_PRIV (self); + GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store); + TpProxy *stored_proxy; + GtkTreeIter iter; + gboolean valid_iter; + + /* Proxy has been invalidated so we find and set it to NULL + * in service store */ + gtk_tree_model_get_iter_first (service_store, &iter); + for (valid_iter = gtk_tree_model_iter_next (service_store, &iter); + valid_iter; + valid_iter = gtk_tree_model_iter_next (service_store, &iter)) + { + gtk_tree_model_get (service_store, &iter, + COL_PROXY, &stored_proxy, + -1); + + if (proxy == stored_proxy) + gtk_list_store_set (priv->service_store, &iter, + COL_PROXY, NULL, + -1); + } + + /* Also, we refresh "All" selection's active buffer since it should not + * show messages obtained from the proxy getting destroyed above */ + refresh_all_buffer (self); } static void @@ -336,35 +423,39 @@ debug_window_get_messages_cb (TpProxy *proxy, { EmpathyDebugWindow *debug_window = (EmpathyDebugWindow *) user_data; EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); - gchar *name; + gchar *active_service_name; guint i; + GtkListStore *active_buffer; + gboolean valid_iter; GtkTreeIter iter; - GtkTreeModel *pause_buffer, *active_buffer; + gchar *proxy_service_name; + active_buffer = g_object_get_data (G_OBJECT (proxy), "active-buffer"); + valid_iter = debug_window_get_iter_for_active_buffer (active_buffer, &iter, + debug_window); + gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter, + COL_NAME, &proxy_service_name, + -1); + + active_service_name = get_active_service_name (debug_window); if (error != NULL) { DEBUG ("GetMessages failed: %s", error->message); - debug_window_set_toolbar_sensitivity (debug_window, FALSE); + + /* We want to set the window sensitivity to false only when proxy for the + * selected service is unable to fetch debug messages */ + if (!tp_strdiff (active_service_name, proxy_service_name)) + debug_window_set_toolbar_sensitivity (debug_window, FALSE); /* We created the proxy for GetMessages call. Now destroy it. */ tp_clear_object (&proxy); return; } - name = get_active_service_name (debug_window); - DEBUG ("Retrieved debug messages for %s", name); - g_free (name); - - gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->chooser), &iter); - gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter, - COL_ACTIVE_BUFFER, &active_buffer, - COL_PAUSE_BUFFER, &pause_buffer, - -1); + DEBUG ("Retrieved debug messages for %s", active_service_name); + g_free (active_service_name); + debug_window_set_toolbar_sensitivity (debug_window, TRUE); - g_object_set_data (G_OBJECT (proxy), "active-buffer", active_buffer); - g_object_set_data (G_OBJECT (proxy), "pause-buffer", pause_buffer); - g_object_unref (active_buffer); - g_object_unref (pause_buffer); for (i = 0; i < messages->len; i++) { @@ -378,11 +469,21 @@ debug_window_get_messages_cb (TpProxy *proxy, } /* Now we save this precious proxy in the service_store along its service */ - gtk_list_store_set (priv->service_store, &iter, COL_PROXY, proxy, -1); + if (valid_iter) + { + DEBUG ("Proxy for service: %s was successful in fetching debug" + " messages. Saving it.", proxy_service_name); + + gtk_list_store_set (priv->service_store, &iter, + COL_PROXY, proxy, + -1); + } + + g_free (proxy_service_name); /* Connect to "invalidated" signal */ g_signal_connect (proxy, "invalidated", - G_CALLBACK (proxy_invalidated_cb), NULL); + G_CALLBACK (proxy_invalidated_cb), debug_window); /* Connect to NewDebugMessage */ emp_cli_debug_connect_to_new_debug_message ( @@ -397,6 +498,79 @@ debug_window_get_messages_cb (TpProxy *proxy, debug_window_set_enabled (proxy, TRUE); } +static void +create_proxy_to_get_messages (EmpathyDebugWindow *debug_window, + GtkTreeIter *iter, + TpDBusDaemon *dbus) +{ + EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); + gchar *bus_name, *name = NULL; + TpProxy *new_proxy, *stored_proxy = NULL; + GtkTreeModel *pause_buffer, *active_buffer; + gboolean gone; + + gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), iter, + COL_NAME, &name, + COL_GONE, &gone, + COL_ACTIVE_BUFFER, &active_buffer, + COL_PAUSE_BUFFER, &pause_buffer, + COL_PROXY, &stored_proxy, + -1); + + /* If the stored_proxy is not NULL then messages have been obtained and + * new-debug-message-signal has been set on it. Also, the proxy is valid. + * If the service is gone, we still display the messages-cached till now. */ + if (gone || + (!gone && stored_proxy != NULL)) + { + /* Nothing needs to be done. The associated active-buffer has already + * been set as view's model */ + goto finally; + } + + DEBUG ("Preparing proxy to obtain messages for service %s", name); + + gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), iter, + COL_UNIQUE_NAME, &bus_name, -1); + new_proxy = g_object_new (TP_TYPE_PROXY, + "bus-name", bus_name, + "dbus-daemon", dbus, + "object-path", DEBUG_OBJECT_PATH, + NULL); + g_free (bus_name); + + g_object_set_data (G_OBJECT (new_proxy), "active-buffer", active_buffer); + g_object_set_data (G_OBJECT (new_proxy), "pause-buffer", pause_buffer); + + /* Now we call GetMessages with fresh proxy. + * The old proxy is NULL due to one of the following - + * * Wasn't saved as last GetMessages call failed + * * The service has newly arrived and no proxy has been prepared yet for it + * * A service with the same name has reappeared but the owner maybe new */ + tp_proxy_add_interface_by_id (new_proxy, emp_iface_quark_debug ()); + + emp_cli_debug_call_get_messages (new_proxy, -1, + debug_window_get_messages_cb, debug_window, NULL, NULL); + +finally: + g_free (name); + tp_clear_object (&stored_proxy); + g_object_unref (active_buffer); + g_object_unref (pause_buffer); +} + +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 */ +} + static gboolean debug_window_visible_func (GtkTreeModel *model, GtkTreeIter *iter, @@ -426,6 +600,7 @@ static gboolean tree_view_search_equal_func_cb (GtkTreeModel *model, gint column, const gchar *key, + GtkTreeIter *iter, gpointer search_data) { @@ -453,6 +628,98 @@ tree_view_search_equal_func_cb (GtkTreeModel *model, return ret; } +static void +update_store_filter (EmpathyDebugWindow *debug_window, + GtkListStore *active_buffer) +{ + EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); + debug_window_set_toolbar_sensitivity (debug_window, FALSE); + + tp_clear_object (&priv->store_filter); + priv->store_filter = gtk_tree_model_filter_new ( + GTK_TREE_MODEL (active_buffer), NULL); + + gtk_tree_model_filter_set_visible_func ( + GTK_TREE_MODEL_FILTER (priv->store_filter), + debug_window_visible_func, debug_window, NULL); + gtk_tree_view_set_model (GTK_TREE_VIEW (priv->view), + priv->store_filter); + + /* Since view's model has changed, reset the search column and + * search_equal_func */ + gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view), + COL_DEBUG_MESSAGE); + gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (priv->view), + tree_view_search_equal_func_cb, NULL, NULL); + + debug_window_set_toolbar_sensitivity (debug_window, TRUE); +} + +static void +refresh_all_buffer (EmpathyDebugWindow *debug_window) +{ + EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); + gboolean valid_iter; + GtkTreeIter iter; + GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store); + + /* Clear All's active-buffer */ + gtk_list_store_clear (priv->all_active_buffer); + + /* Skipping the first service store iter which is reserved for "All" */ + gtk_tree_model_get_iter_first (service_store, &iter); + for (valid_iter = gtk_tree_model_iter_next (service_store, &iter); + valid_iter; + valid_iter = gtk_tree_model_iter_next (service_store, &iter)) + { + TpProxy *proxy = NULL; + GtkListStore *service_active_buffer; + gboolean gone; + + gtk_tree_model_get (service_store, &iter, + COL_GONE, &gone, + COL_PROXY, &proxy, + COL_ACTIVE_BUFFER, &service_active_buffer, + -1); + + if (gone) + { + gtk_tree_model_foreach (GTK_TREE_MODEL (service_active_buffer), + copy_buffered_messages, priv->all_active_buffer); + } + else + { + if (proxy != NULL) + { + if (service_active_buffer == NULL) + break; + + /* Copy the debug messages to all_active_buffer */ + gtk_tree_model_foreach (GTK_TREE_MODEL (service_active_buffer), + copy_buffered_messages, priv->all_active_buffer); + } + else + { + GError *error = NULL; + TpDBusDaemon *dbus = tp_dbus_daemon_dup (&error); + + if (error != NULL) + { + DEBUG ("Failed at duping the dbus daemon: %s", error->message); + g_error_free (error); + } + + create_proxy_to_get_messages (debug_window, &iter, dbus); + + g_object_unref (dbus); + } + } + + g_object_unref (service_active_buffer); + tp_clear_object (&proxy); + } +} + static void debug_window_service_chooser_changed_cb (GtkComboBox *chooser, EmpathyDebugWindow *debug_window) @@ -460,9 +727,8 @@ debug_window_service_chooser_changed_cb (GtkComboBox *chooser, EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); TpDBusDaemon *dbus; GError *error = NULL; - gchar *bus_name, *name = NULL; - TpProxy *new_proxy, *stored_proxy = NULL; GtkListStore *stored_active_buffer = NULL; + gchar *name = NULL; GtkTreeIter iter; gboolean gone; @@ -477,49 +743,30 @@ debug_window_service_chooser_changed_cb (GtkComboBox *chooser, return; } + debug_window_set_toolbar_sensitivity (debug_window, TRUE); + gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter, COL_NAME, &name, COL_GONE, &gone, COL_ACTIVE_BUFFER, &stored_active_buffer, - COL_PROXY, &stored_proxy, -1); - if (stored_active_buffer == NULL) + DEBUG ("Service chosen: %s", name); + + if (tp_strdiff (name, "All") && stored_active_buffer == NULL) { DEBUG ("No list store assigned to service %s", name); goto finally; } - debug_window_set_toolbar_sensitivity (debug_window, TRUE); - - tp_clear_object (&priv->store_filter); - priv->store_filter = gtk_tree_model_filter_new ( - GTK_TREE_MODEL (stored_active_buffer), NULL); - - gtk_tree_model_filter_set_visible_func ( - GTK_TREE_MODEL_FILTER (priv->store_filter), - debug_window_visible_func, debug_window, NULL); - - gtk_tree_view_set_model (GTK_TREE_VIEW (priv->view), priv->store_filter); - - /* Since view's model has changed, reset the search column and - * search_equal_func */ - gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view), - COL_DEBUG_MESSAGE); - gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (priv->view), - tree_view_search_equal_func_cb, NULL, NULL); - - /* If the stored_proxy is not NULL then messages have been obtained and - * new-debug-message-signal has been set on it. Also, the proxy is valid. - * If the service is gone, we still display the messages-cached till now. */ - if (gone || - (!gone && stored_proxy != NULL)) + if (!tp_strdiff (name, "All")) { - /* Nothing needs to be done. The associated active-buffer has already - * been set as view's model */ + update_store_filter (debug_window, priv->all_active_buffer); goto finally; } + update_store_filter (debug_window, stored_active_buffer); + dbus = tp_dbus_daemon_dup (&error); if (error != NULL) @@ -527,31 +774,13 @@ debug_window_service_chooser_changed_cb (GtkComboBox *chooser, DEBUG ("Failed at duping the dbus daemon: %s", error->message); } - gtk_tree_model_get (GTK_TREE_MODEL (priv->service_store), &iter, - COL_UNIQUE_NAME, &bus_name, -1); - new_proxy = g_object_new (TP_TYPE_PROXY, - "bus-name", bus_name, - "dbus-daemon", dbus, - "object-path", DEBUG_OBJECT_PATH, - NULL); - g_free (bus_name); - - /* Now we call GetMessages with fresh proxy. - * The old proxy is NULL due to one of the following - - * * Wasn't saved as last GetMessages call failed - * * The service has newly arrived and no proxy has been prepared yet for it - * * A service with the same name has reappeared but the owner maybe new */ - tp_proxy_add_interface_by_id (new_proxy, emp_iface_quark_debug ()); - - emp_cli_debug_call_get_messages (new_proxy, -1, - debug_window_get_messages_cb, debug_window, NULL, NULL); + create_proxy_to_get_messages (debug_window, &iter, dbus); g_object_unref (dbus); finally: g_free (name); tp_clear_object (&stored_active_buffer); - tp_clear_object (&stored_proxy); } typedef struct @@ -698,18 +927,6 @@ fill_service_chooser_data_free (FillServiceChooserData *data) g_slice_free (FillServiceChooserData, data); } -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 */ -} - static void debug_window_get_name_owner_cb (TpDBusDaemon *proxy, const gchar *out, @@ -720,6 +937,9 @@ debug_window_get_name_owner_cb (TpDBusDaemon *proxy, FillServiceChooserData *data = (FillServiceChooserData *) user_data; EmpathyDebugWindow *self = EMPATHY_DEBUG_WINDOW (data->debug_window); EmpathyDebugWindowPriv *priv = GET_PRIV (data->debug_window); + GtkTreeIter iter; + + priv->name_owner_cb_count++; if (error != NULL) { @@ -729,7 +949,6 @@ debug_window_get_name_owner_cb (TpDBusDaemon *proxy, if (!debug_window_service_is_in_model (data->debug_window, out, NULL, FALSE)) { - GtkTreeIter iter; char *name; GtkListStore *active_buffer, *pause_buffer; @@ -745,8 +964,7 @@ debug_window_get_name_owner_cb (TpDBusDaemon *proxy, active_buffer = new_list_store_for_service (); pause_buffer = new_list_store_for_service (); - gtk_list_store_append (priv->service_store, &iter); - gtk_list_store_set (priv->service_store, &iter, + gtk_list_store_insert_with_values (priv->service_store, &iter, -1, COL_NAME, name, COL_UNIQUE_NAME, out, COL_GONE, FALSE, @@ -768,6 +986,22 @@ debug_window_get_name_owner_cb (TpDBusDaemon *proxy, g_free (name); } + if (priv->services_detected == priv->name_owner_cb_count) + { + /* Time to add "All" selection to service_store */ + gtk_list_store_insert_with_values (priv->service_store, &iter, 0, + COL_NAME, "All", + COL_ACTIVE_BUFFER, NULL, + -1); + + priv->all_active_buffer = new_list_store_for_service (); + + /* Populate active buffers for all services */ + refresh_all_buffer (self); + + gtk_combo_box_set_active (GTK_COMBO_BOX (priv->chooser), 0); + } + OUT: fill_service_chooser_data_free (data); } @@ -782,6 +1016,7 @@ debug_window_list_connection_names_cb (const gchar * const *names, GObject *weak_object) { EmpathyDebugWindow *debug_window = (EmpathyDebugWindow *) user_data; + EmpathyDebugWindowPriv *priv = GET_PRIV (debug_window); guint i; TpDBusDaemon *dbus; GError *error2 = NULL; @@ -809,6 +1044,8 @@ debug_window_list_connection_names_cb (const gchar * const *names, tp_cli_dbus_daemon_call_get_name_owner (dbus, -1, names[i], debug_window_get_name_owner_cb, data, NULL, NULL); + + priv->services_detected ++; } g_object_unref (dbus); @@ -864,8 +1101,7 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy, active_buffer = new_list_store_for_service (); pause_buffer = new_list_store_for_service (); - gtk_list_store_append (priv->service_store, &iter); - gtk_list_store_set (priv->service_store, &iter, + gtk_list_store_insert_with_values (priv->service_store, &iter, -1, COL_NAME, display_name, COL_UNIQUE_NAME, arg2, COL_GONE, FALSE, @@ -913,6 +1149,13 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy, (GTK_COMBO_BOX (priv->chooser), user_data); } + /* If a new service arrives when "All" is selected, the view will + * not show its messages which we do not want. So we refresh All's + * active buffer. + * Similarly for when a service with an already seen service name + * appears. */ + refresh_all_buffer (self); + g_free (display_name); } else if (!EMP_STR_EMPTY (arg1) && EMP_STR_EMPTY (arg2)) @@ -929,6 +1172,9 @@ debug_window_name_owner_changed_cb (TpDBusDaemon *proxy, iter, COL_GONE, TRUE, -1); gtk_tree_iter_free (iter); } + + /* Refresh all's active buffer */ + refresh_all_buffer (self); } } @@ -946,6 +1192,8 @@ add_client (EmpathyDebugWindow *self, tp_cli_dbus_daemon_call_get_name_owner (priv->dbus, -1, name, debug_window_get_name_owner_cb, data, NULL, NULL); + + priv->services_detected ++; } static void @@ -990,6 +1238,10 @@ debug_window_fill_service_chooser (EmpathyDebugWindow *debug_window) return; } + /* Keep a count of the services detected and added */ + priv->services_detected = 0; + priv->name_owner_cb_count = 0; + /* Add CMs to list */ tp_list_connection_names (priv->dbus, debug_window_list_connection_names_cb, debug_window, NULL, NULL); @@ -998,8 +1250,7 @@ debug_window_fill_service_chooser (EmpathyDebugWindow *debug_window) active_buffer= new_list_store_for_service (); pause_buffer = new_list_store_for_service (); - gtk_list_store_append (priv->service_store, &iter); - gtk_list_store_set (priv->service_store, &iter, + gtk_list_store_insert_with_values (priv->service_store, &iter, -1, COL_NAME, "mission-control", COL_UNIQUE_NAME, "org.freedesktop.Telepathy.MissionControl5", COL_GONE, FALSE, @@ -1010,8 +1261,6 @@ debug_window_fill_service_chooser (EmpathyDebugWindow *debug_window) g_object_unref (active_buffer); g_object_unref (pause_buffer); - gtk_combo_box_set_active (GTK_COMBO_BOX (priv->chooser), 0); - /* add clients */ tp_dbus_daemon_list_names (priv->dbus, 2000, list_names_cb, NULL, NULL, G_OBJECT (debug_window)); @@ -1035,12 +1284,14 @@ debug_window_pause_toggled_cb (GtkToggleToolButton *pause_, if (!priv->paused) { /* Pause has been released - flush all pause buffers */ + GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store); - for (valid_iter = gtk_tree_model_get_iter_first (model, &iter); + /* Skipping the first iter which is reserved for "All" */ + gtk_tree_model_get_iter_first (model, &iter); + for (valid_iter = gtk_tree_model_iter_next (model, &iter); valid_iter; valid_iter = gtk_tree_model_iter_next (model, &iter)) { - GtkTreeModel *service_store = GTK_TREE_MODEL (priv->service_store); GtkListStore *pause_buffer, *active_buffer; gtk_tree_model_get (service_store, &iter, @@ -1049,12 +1300,15 @@ debug_window_pause_toggled_cb (GtkToggleToolButton *pause_, -1); gtk_tree_model_foreach (GTK_TREE_MODEL (pause_buffer), - flush_buffered_messages_to_list_store, active_buffer); + copy_buffered_messages, active_buffer); + gtk_tree_model_foreach (GTK_TREE_MODEL (pause_buffer), + copy_buffered_messages, priv->all_active_buffer); + gtk_list_store_clear (pause_buffer); g_object_unref (active_buffer); g_object_unref (pause_buffer); - } + } } } @@ -1621,38 +1875,32 @@ am_prepared_cb (GObject *am, gtk_combo_box_set_model (GTK_COMBO_BOX (priv->level_filter), GTK_TREE_MODEL (level_store)); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Debug"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_DEBUG, -1); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Info"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_INFO, -1); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Message"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_MESSAGE, -1); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Warning"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_WARNING, -1); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Critical"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_CRITICAL, -1); - gtk_list_store_append (level_store, &iter); - gtk_list_store_set (level_store, &iter, + gtk_list_store_insert_with_values (level_store, &iter, -1, COL_LEVEL_NAME, _("Error"), COL_LEVEL_VALUE, TP_DEBUG_LEVEL_ERROR, -1); @@ -1710,6 +1958,8 @@ am_prepared_cb (GObject *am, priv->view_visible = FALSE; + priv->all_active_buffer = NULL; + debug_window_set_toolbar_sensitivity (EMPATHY_DEBUG_WINDOW (object), FALSE); debug_window_fill_service_chooser (EMPATHY_DEBUG_WINDOW (object)); gtk_widget_show (GTK_WIDGET (object)); @@ -1800,6 +2050,8 @@ debug_window_dispose (GObject *object) priv->am = NULL; } + tp_clear_object (&priv->all_active_buffer); + (G_OBJECT_CLASS (empathy_debug_window_parent_class)->dispose) (object); }