diff options
-rw-r--r-- | trace-view.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/trace-view.c b/trace-view.c index 140bfcd..59e7e1a 100644 --- a/trace-view.c +++ b/trace-view.c | |||
@@ -525,23 +525,41 @@ void trace_view_cpu_filter_callback(gboolean accept, | |||
525 | gpointer data) | 525 | gpointer data) |
526 | { | 526 | { |
527 | GtkTreeView *trace_tree = data; | 527 | GtkTreeView *trace_tree = data; |
528 | TraceViewRecord *rec; | ||
528 | GtkTreeModel *model; | 529 | GtkTreeModel *model; |
529 | TraceViewStore *store; | 530 | TraceViewStore *store; |
531 | guint64 time = 0; | ||
532 | gint selected_row; | ||
530 | gint cpus; | 533 | gint cpus; |
531 | gint cpu; | 534 | gint cpu; |
532 | 535 | ||
536 | if (!accept) | ||
537 | return; | ||
538 | |||
533 | model = gtk_tree_view_get_model(trace_tree); | 539 | model = gtk_tree_view_get_model(trace_tree); |
534 | if (!model) | 540 | if (!model) |
535 | return; | 541 | return; |
536 | 542 | ||
537 | store = TRACE_VIEW_STORE(model); | 543 | store = TRACE_VIEW_STORE(model); |
538 | 544 | ||
539 | if (!accept) | 545 | selected_row = trace_view_get_selected_row(GTK_WIDGET(trace_tree)); |
540 | return; | 546 | if (selected_row < 0) |
547 | selected_row = 0; | ||
541 | 548 | ||
542 | g_object_ref(store); | 549 | g_object_ref(store); |
543 | gtk_tree_view_set_model(trace_tree, NULL); | 550 | gtk_tree_view_set_model(trace_tree, NULL); |
544 | 551 | ||
552 | /* | ||
553 | * If the selected row is not part of one of the CPUs | ||
554 | * that are kept, then find one that is. Do nothing if | ||
555 | * the first row is selected. | ||
556 | */ | ||
557 | if (selected_row) { | ||
558 | /* Save this timestamp */ | ||
559 | rec = trace_view_store_get_visible_row(TRACE_VIEW_STORE(model), selected_row); | ||
560 | time = rec->timestamp; | ||
561 | } | ||
562 | |||
545 | if (all_cpus) { | 563 | if (all_cpus) { |
546 | trace_view_store_set_all_cpus(store); | 564 | trace_view_store_set_all_cpus(store); |
547 | goto set_model; | 565 | goto set_model; |
@@ -559,6 +577,14 @@ void trace_view_cpu_filter_callback(gboolean accept, | |||
559 | set_model: | 577 | set_model: |
560 | gtk_tree_view_set_model(trace_tree, GTK_TREE_MODEL(store)); | 578 | gtk_tree_view_set_model(trace_tree, GTK_TREE_MODEL(store)); |
561 | g_object_unref(store); | 579 | g_object_unref(store); |
580 | |||
581 | if (!time) | ||
582 | return; | ||
583 | /* | ||
584 | * Try to select the row that was near the selection | ||
585 | * before the change. | ||
586 | */ | ||
587 | trace_view_select(GTK_WIDGET(trace_tree), time); | ||
562 | } | 588 | } |
563 | 589 | ||
564 | static GtkTreeModel *create_col_model(GtkTreeView *treeview) | 590 | static GtkTreeModel *create_col_model(GtkTreeView *treeview) |