From 810abc5b84f2855cc328cb709e75046a646be463 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Tue, 30 Mar 2010 16:45:31 -0400 Subject: kernelshark: Created trace_get_file_dialog() to ask for filename Added shortcut trace_get_file_dialog() to simplify the asking for a file name. Signed-off-by: Steven Rostedt --- trace-view-main.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 52678ce..7f1461b 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -28,6 +28,7 @@ #include "trace-cmd.h" #include "trace-view.h" +#include "trace-gui.h" #define version "0.1.1" @@ -55,26 +56,19 @@ load_clicked (gpointer data) { struct trace_tree_info *info = data; struct tracecmd_input *handle; - GtkWidget *dialog; gchar *filename; - dialog = gtk_file_chooser_dialog_new("Load File", - NULL, - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - handle = tracecmd_open(filename); - if (handle) { - trace_view_reload(info->trace_tree, handle, info->spin); - /* Free handle when freeing the trace tree */ - tracecmd_close(handle); - } - g_free(filename); + filename = trace_get_file_dialog("Load File"); + if (!filename) + return; + + handle = tracecmd_open(filename); + if (handle) { + trace_view_reload(info->trace_tree, handle, info->spin); + /* Free handle when freeing the trace tree */ + tracecmd_close(handle); } - gtk_widget_destroy(dialog); + g_free(filename); } /* Callback for the clicked signal of the Exit button */ -- cgit v1.2.2 From 3f1e092ed414ab2a9f73eafe87f35e868030463c Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 31 Mar 2010 05:32:43 -0400 Subject: trace-view: Added saving of filters Add "Save filters" to "File" menu, where it will allow the user to save the filters to a file in XML format. Signed-off-by: Steven Rostedt --- trace-view-main.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 7f1461b..52fb4f8 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -28,6 +28,7 @@ #include "trace-cmd.h" #include "trace-view.h" +#include "trace-xml.h" #include "trace-gui.h" #define version "0.1.1" @@ -71,6 +72,29 @@ load_clicked (gpointer data) g_free(filename); } +/* Callback for the clicked signal of the Save State button */ +static void +save_filters_clicked (gpointer data) +{ + struct trace_tree_info *info = data; + GtkTreeView *trace_tree = GTK_TREE_VIEW(info->trace_tree); + struct tracecmd_xml_handle *handle; + gchar *filename; + + filename = trace_get_file_dialog("Save State"); + if (!filename) + return; + + handle = tracecmd_xml_create(filename); + if (!handle) + warning("Could not create save state %s", filename); + g_free(filename); + + trace_view_save_filters(handle, trace_tree); + + tracecmd_xml_close(handle); +} + /* Callback for the clicked signal of the Exit button */ static void exit_clicked (GtkWidget *widget, gpointer data) @@ -249,12 +273,11 @@ void trace_view(int argc, char **argv) /* --- File - Load Option --- */ - sub_item = gtk_menu_item_new_with_label("Load info"); + sub_item = gtk_menu_item_new_with_label("Load data"); /* Add them to the menu */ gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); - /* We can attach the Quit menu item to our exit function */ g_signal_connect_swapped (G_OBJECT (sub_item), "activate", G_CALLBACK (load_clicked), (gpointer) &tree_info); @@ -263,6 +286,21 @@ void trace_view(int argc, char **argv) gtk_widget_show(sub_item); + /* --- File - Save State Option --- */ + + sub_item = gtk_menu_item_new_with_label("Save filters"); + + /* Add them to the menu */ + gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); + + g_signal_connect_swapped (G_OBJECT (sub_item), "activate", + G_CALLBACK (save_filters_clicked), + (gpointer) &tree_info); + + /* We do need to show menu items */ + gtk_widget_show(sub_item); + + /* --- File - Quit Option --- */ sub_item = gtk_menu_item_new_with_label("Quit"); -- cgit v1.2.2 From b2a9cd2f38f6c3c30e9ef4c47eb004b41b50fe5e Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 5 Apr 2010 12:40:51 -0400 Subject: trace-view: Add loading of saved event filters Add "Load filters" to trace-view that loads the event filters saved with a "Save filters". Signed-off-by: Steven Rostedt --- trace-view-main.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 52fb4f8..22b9e32 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -72,7 +72,30 @@ load_clicked (gpointer data) g_free(filename); } -/* Callback for the clicked signal of the Save State button */ +/* Callback for the clicked signal of the Load Filters button */ +static void +load_filters_clicked (gpointer data) +{ + struct trace_tree_info *info = data; + GtkTreeView *trace_tree = GTK_TREE_VIEW(info->trace_tree); + struct tracecmd_xml_handle *handle; + gchar *filename; + + filename = trace_get_file_dialog("Load Filters"); + if (!filename) + return; + + handle = tracecmd_xml_open(filename); + if (!handle) + warning("Could not open %s", filename); + g_free(filename); + + trace_view_load_filters(handle, trace_tree); + + tracecmd_xml_close(handle); +} + +/* Callback for the clicked signal of the Save Filters button */ static void save_filters_clicked (gpointer data) { @@ -81,13 +104,13 @@ save_filters_clicked (gpointer data) struct tracecmd_xml_handle *handle; gchar *filename; - filename = trace_get_file_dialog("Save State"); + filename = trace_get_file_dialog("Save Filters"); if (!filename) return; handle = tracecmd_xml_create(filename); if (!handle) - warning("Could not create save state %s", filename); + warning("Could not create %s", filename); g_free(filename); trace_view_save_filters(handle, trace_tree); @@ -286,7 +309,22 @@ void trace_view(int argc, char **argv) gtk_widget_show(sub_item); - /* --- File - Save State Option --- */ + /* --- File - Load Filter Option --- */ + + sub_item = gtk_menu_item_new_with_label("Load filters"); + + /* Add them to the menu */ + gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); + + g_signal_connect_swapped (G_OBJECT (sub_item), "activate", + G_CALLBACK (load_filters_clicked), + (gpointer) &tree_info); + + /* We do need to show menu items */ + gtk_widget_show(sub_item); + + + /* --- File - Save Filter Option --- */ sub_item = gtk_menu_item_new_with_label("Save filters"); -- cgit v1.2.2 From 81b404df1d425f146527dc3da253365071e68bea Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 5 Apr 2010 17:28:12 -0400 Subject: trace-view: Add pop-up task menu for filtering tasks Add pop-up menu over the rows that will allow to filter on tasks in trace-view. Signed-off-by: Steven Rostedt --- trace-view-main.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 214 insertions(+), 13 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 22b9e32..74922fb 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -30,6 +30,7 @@ #include "trace-view.h" #include "trace-xml.h" #include "trace-gui.h" +#include "trace-compat.h" #define version "0.1.1" @@ -40,8 +41,13 @@ static char *input_file; struct trace_tree_info { - GtkWidget *trace_tree; - GtkWidget *spin; + struct tracecmd_input *handle; + GtkWidget *trace_tree; + GtkWidget *spin; + gint filter_enabled; + gint filter_task_selected; + struct filter_task *task_filter; + struct filter_task *hide_tasks; }; void usage(char *prog) @@ -68,6 +74,7 @@ load_clicked (gpointer data) trace_view_reload(info->trace_tree, handle, info->spin); /* Free handle when freeing the trace tree */ tracecmd_close(handle); + info->handle = handle; } g_free(filename); } @@ -203,24 +210,209 @@ cpus_clicked (gpointer data) trace_view_cpu_filter_callback, trace_tree); } -#if 0 -static GtkTreeModel * -create_combo_box_model(void) +static void +filter_list_clicked (gpointer data) +{ + struct trace_tree_info *info = data; + + if (!filter_task_count(info->task_filter) && + !filter_task_count(info->hide_tasks)) + return; + + info->filter_enabled ^= 1; + + if (info->filter_enabled) + trace_view_update_filters(info->trace_tree, + info->task_filter, + info->hide_tasks); + else + trace_view_update_filters(info->trace_tree, NULL, NULL); +} + +static void update_task_filter(struct trace_tree_info *info, + struct filter_task *filter) +{ + struct filter_task_item *task; + gint pid = info->filter_task_selected; + + task = filter_task_find_pid(filter, pid); + + if (task) + filter_task_remove_pid(filter, pid); + else + filter_task_add_pid(filter, pid); + + if (info->filter_enabled) + trace_view_update_filters(info->trace_tree, + info->task_filter, + info->hide_tasks); +} + +static void filter_add_task_clicked(gpointer data) +{ + struct trace_tree_info *info = data; + + update_task_filter(info, info->task_filter); +} + +static void filter_hide_task_clicked(gpointer data) { - GtkListStore *store; - GtkTreeIter iter; + struct trace_tree_info *info = data; - store = gtk_list_store_new(1, G_TYPE_STRING); - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, "1", -1); + update_task_filter(info, info->hide_tasks); +} + +static void +filter_clear_tasks_clicked (gpointer data) +{ + struct trace_tree_info *info = data; - return GTK_TREE_MODEL(store); + trace_view_update_filters(info->trace_tree, NULL, NULL); + info->filter_enabled = 0; +} + +static gboolean +do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + struct trace_tree_info *info = data; + static GtkWidget *menu; + static GtkWidget *menu_filter_enable; + static GtkWidget *menu_filter_add_task; + static GtkWidget *menu_filter_hide_task; + static GtkWidget *menu_filter_clear_tasks; + struct pevent *pevent; + struct record *record; + TraceViewRecord *vrec; + GtkTreeModel *model; + const char *comm; + gchar *text; + gint pid; + gint len; + guint64 offset; + gint row; + gint cpu; + + if (!menu) { + menu = gtk_menu_new(); + + menu_filter_enable = gtk_menu_item_new_with_label("Enable Filter"); + gtk_widget_show(menu_filter_enable); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_enable); + + g_signal_connect_swapped (G_OBJECT (menu_filter_enable), "activate", + G_CALLBACK (filter_list_clicked), + data); + + menu_filter_add_task = gtk_menu_item_new_with_label("Add Task"); + gtk_widget_show(menu_filter_add_task); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_add_task); + + g_signal_connect_swapped (G_OBJECT (menu_filter_add_task), "activate", + G_CALLBACK (filter_add_task_clicked), + data); + + menu_filter_hide_task = gtk_menu_item_new_with_label("Hide Task"); + gtk_widget_show(menu_filter_hide_task); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_hide_task); + + g_signal_connect_swapped (G_OBJECT (menu_filter_hide_task), "activate", + G_CALLBACK (filter_hide_task_clicked), + data); + + menu_filter_clear_tasks = gtk_menu_item_new_with_label("Clear Task Filter"); + gtk_widget_show(menu_filter_clear_tasks); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_filter_clear_tasks); + + g_signal_connect_swapped (G_OBJECT (menu_filter_clear_tasks), "activate", + G_CALLBACK (filter_clear_tasks_clicked), + data); + + } + + row = trace_view_get_selected_row(GTK_WIDGET(info->trace_tree)); + if (row >= 0) { + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(info->trace_tree)); + vrec = trace_view_store_get_row(TRACE_VIEW_STORE(model), row); + offset = vrec->offset; + + record = tracecmd_read_at(info->handle, offset, &cpu); + + if (record) { + pevent = tracecmd_get_pevent(info->handle); + pid = pevent_data_pid(pevent, record); + comm = pevent_data_comm_from_pid(pevent, pid); + + len = strlen(comm) + 50; + + text = g_malloc(len); + g_assert(text); + + if (filter_task_find_pid(info->task_filter, pid)) + snprintf(text, len, "Remove %s-%d to filter", comm, pid); + else + snprintf(text, len, "Add %s-%d to filter", comm, pid); + + info->filter_task_selected = pid; + + gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_add_task), + text); + + if (filter_task_find_pid(info->hide_tasks, pid)) + snprintf(text, len, "Show %s-%d", comm, pid); + else + snprintf(text, len, "Hide %s-%d", comm, pid); + + gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task), + text); + + g_free(text); + + info->filter_task_selected = pid; + + gtk_widget_show(menu_filter_add_task); + gtk_widget_show(menu_filter_hide_task); + free_record(record); + } + } else { + gtk_widget_hide(menu_filter_add_task); + gtk_widget_hide(menu_filter_hide_task); + } + + if (info->filter_enabled) + gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_enable), + "Disable List Filter"); + else + gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_enable), + "Enable List Filter"); + + if (filter_task_count(info->task_filter) || + filter_task_count(info->hide_tasks)) { + gtk_widget_set_sensitive(menu_filter_clear_tasks, TRUE); + gtk_widget_set_sensitive(menu_filter_enable, TRUE); + } else { + gtk_widget_set_sensitive(menu_filter_clear_tasks, FALSE); + gtk_widget_set_sensitive(menu_filter_enable, FALSE); + } + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, + gtk_get_current_event_time()); + + return TRUE; +} + +static gboolean +button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + if (event->button == 3) + return do_tree_popup(widget, event, data); + + return FALSE; } -#endif void trace_view(int argc, char **argv) { - static struct tracecmd_input *handle; + static struct tracecmd_input *handle = NULL; struct trace_tree_info tree_info; struct stat st; GtkWidget *trace_tree; @@ -268,6 +460,11 @@ void trace_view(int argc, char **argv) if (input_file) handle = tracecmd_open(input_file); + memset(&tree_info, 0, sizeof(tree_info)); + tree_info.handle = handle; + tree_info.task_filter = filter_task_hash_alloc(); + tree_info.hide_tasks = filter_task_hash_alloc(); + /* --- Main window --- */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -455,6 +652,10 @@ void trace_view(int argc, char **argv) gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); + gtk_signal_connect(GTK_OBJECT(trace_tree), "button_press_event", + (GtkSignalFunc) button_press_event, + (gpointer) &tree_info); + trace_view_search_setup(GTK_BOX(hbox), GTK_TREE_VIEW(trace_tree)); /* --- Top Level Hbox --- */ -- cgit v1.2.2 From 64be78aa61dfda0c5fdf5c7ccfc2d9a93ba52aa5 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 5 Apr 2010 20:56:05 -0400 Subject: trace-view: Add save and load of task filters Include saving of the task filters to the filter file as well as the ability to load them. Signed-off-by: Steven Rostedt --- trace-view-main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 74922fb..af9dc5d 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -97,7 +97,8 @@ load_filters_clicked (gpointer data) warning("Could not open %s", filename); g_free(filename); - trace_view_load_filters(handle, trace_tree); + trace_view_load_filters(handle, trace_tree, info->task_filter, + info->hide_tasks); tracecmd_xml_close(handle); } @@ -120,7 +121,8 @@ save_filters_clicked (gpointer data) warning("Could not create %s", filename); g_free(filename); - trace_view_save_filters(handle, trace_tree); + trace_view_save_filters(handle, trace_tree, + info->task_filter, info->hide_tasks); tracecmd_xml_close(handle); } -- cgit v1.2.2 From 20359fdc358744dee36b8e59c234e965fc7d2a69 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 5 Apr 2010 22:40:54 -0400 Subject: kernelshark: Make all saved filters under KernelShark Make the xml doc under ... for trace-view and trace-graph. Also pull out the task filters since the view and graph in kernelshark share the same filters. Signed-off-by: Steven Rostedt --- trace-view-main.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index af9dc5d..e6c0361 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -29,9 +29,12 @@ #include "trace-cmd.h" #include "trace-view.h" #include "trace-xml.h" +#include "trace-filter.h" #include "trace-gui.h" #include "trace-compat.h" +#include "version.h" + #define version "0.1.1" #define TRACE_WIDTH 800 @@ -93,12 +96,16 @@ load_filters_clicked (gpointer data) return; handle = tracecmd_xml_open(filename); - if (!handle) + if (!handle) { warning("Could not open %s", filename); + return; + } g_free(filename); - trace_view_load_filters(handle, trace_tree, info->task_filter, - info->hide_tasks); + trace_filter_load_filters(handle, info->task_filter, + info->hide_tasks); + + trace_view_load_filters(handle, trace_tree); tracecmd_xml_close(handle); } @@ -116,13 +123,13 @@ save_filters_clicked (gpointer data) if (!filename) return; - handle = tracecmd_xml_create(filename); + handle = tracecmd_xml_create(filename, VERSION_STRING); if (!handle) warning("Could not create %s", filename); g_free(filename); - trace_view_save_filters(handle, trace_tree, - info->task_filter, info->hide_tasks); + trace_filter_save_filters(handle, info->task_filter, info->hide_tasks); + trace_view_save_filters(handle, trace_tree); tracecmd_xml_close(handle); } -- cgit v1.2.2 From 935a801c7f3eab7bad5c183a702a506540d32700 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 5 Apr 2010 22:48:07 -0400 Subject: kernelshark: Fixed grammar on popup menu remove task The popup menu for removing a task said: Remove task to filter when it should be saying: Remove task from filter Signed-off-by: Steven Rostedt --- trace-view-main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index e6c0361..8f1b180 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -358,7 +358,7 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) g_assert(text); if (filter_task_find_pid(info->task_filter, pid)) - snprintf(text, len, "Remove %s-%d to filter", comm, pid); + snprintf(text, len, "Remove %s-%d from filter", comm, pid); else snprintf(text, len, "Add %s-%d to filter", comm, pid); -- cgit v1.2.2 From b75d856e313af97226686e3ada78b633874ded29 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Tue, 6 Apr 2010 12:33:46 -0400 Subject: kernelshark: Move status bar to general code for trace-view and trace-graph Move the code for the status bar to trace-dialog.c and have trace-view and trace-graph have access to it too. Signed-off-by: Steven Rostedt --- trace-view-main.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 8f1b180..bc7e4ee 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -435,6 +435,7 @@ void trace_view(int argc, char **argv) GtkWidget *scrollwin; GtkWidget *label; GtkWidget *spin; + GtkWidget *statusbar; int ret; int c; @@ -687,6 +688,13 @@ void trace_view(int argc, char **argv) gtk_widget_show(trace_tree); + /* --- Set up Status Bar --- */ + + statusbar = trace_status_bar_new(); + + gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); + gtk_widget_show(statusbar); + /********************************************** * Main Window **********************************************/ -- cgit v1.2.2 From 0af521a7ba132afbc83aff1216ce3457f97cc09c Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Tue, 6 Apr 2010 14:48:18 -0400 Subject: kernelshark: Add warning dialogs When a warning happens, show it with a dialog instead of printing to the console. Signed-off-by: Steven Rostedt --- trace-view-main.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index bc7e4ee..8fa9aa6 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -479,6 +479,8 @@ void trace_view(int argc, char **argv) window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + trace_dialog_register_window(window); + /* --- Top Level Vbox --- */ vbox = gtk_vbox_new(FALSE, 0); -- cgit v1.2.2 From ce6dcdc247fc6194566360e74fcb986fa656043a Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Thu, 10 Jun 2010 16:15:19 -0400 Subject: kernelshark: Fix the xml save/load to handle separate task filters Update the save/load of the filters to handle the change to make the List and Graph have separate task filters. Signed-off-by: Steven Rostedt --- trace-view-main.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'trace-view-main.c') diff --git a/trace-view-main.c b/trace-view-main.c index 8fa9aa6..59d6838 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -102,7 +102,9 @@ load_filters_clicked (gpointer data) } g_free(filename); - trace_filter_load_filters(handle, info->task_filter, + trace_filter_load_filters(handle, + "ListTaskFilter", + info->task_filter, info->hide_tasks); trace_view_load_filters(handle, trace_tree); @@ -128,7 +130,9 @@ save_filters_clicked (gpointer data) warning("Could not create %s", filename); g_free(filename); - trace_filter_save_filters(handle, info->task_filter, info->hide_tasks); + trace_filter_save_filters(handle, + "ListTaskFilter", + info->task_filter, info->hide_tasks); trace_view_save_filters(handle, trace_tree); tracecmd_xml_close(handle); -- cgit v1.2.2