diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-03-04 11:14:20 -0500 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-03-04 11:26:18 -0500 |
| commit | 264e6579fade0e9bca9823ce7272a3cbd7f2d647 (patch) | |
| tree | 4099bbe9850012709baea43ac7d01c713e5b11ea | |
| parent | dd08a70a9f50ae01748c0b09e0f68ea793f0f3a6 (diff) | |
trace-view: Keep selected row after CPU filters
After a CPU filtering event happened, the selected row was lost
and the first row is selected. This gets annoying when you have
a row selected and want to filter out the other CPUs. You would
lose the row and then have to search for it again.
This patch reselects the selected row after a CPU filter change.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -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) |
