aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-filter.c148
1 files changed, 143 insertions, 5 deletions
diff --git a/trace-filter.c b/trace-filter.c
index db05679..f9c384f 100644
--- a/trace-filter.c
+++ b/trace-filter.c
@@ -35,6 +35,8 @@ struct dialog_helper {
35 35
36enum { 36enum {
37 COL_EVENT, 37 COL_EVENT,
38 COL_ACTIVE,
39 COL_ACTIVE_START,
38 NUM_EVENT_COLS, 40 NUM_EVENT_COLS,
39}; 41};
40 42
@@ -56,11 +58,14 @@ create_tree_event_model(GtkWidget *tree_view)
56 58
57 pevent = tracecmd_get_pevent(trace_view->handle); 59 pevent = tracecmd_get_pevent(trace_view->handle);
58 60
59 treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING); 61 treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING,
62 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
60 63
61 gtk_tree_store_append(treestore, &iter_all, NULL); 64 gtk_tree_store_append(treestore, &iter_all, NULL);
62 gtk_tree_store_set(treestore, &iter_all, 65 gtk_tree_store_set(treestore, &iter_all,
63 COL_EVENT, "All", 66 COL_EVENT, "All",
67 COL_ACTIVE, TRUE,
68 COL_ACTIVE_START, FALSE,
64 -1); 69 -1);
65 70
66 events = pevent_list_events(pevent, EVENT_SORT_SYSTEM); 71 events = pevent_list_events(pevent, EVENT_SORT_SYSTEM);
@@ -73,6 +78,7 @@ create_tree_event_model(GtkWidget *tree_view)
73 gtk_tree_store_append(treestore, &iter_sys, &iter_all); 78 gtk_tree_store_append(treestore, &iter_sys, &iter_all);
74 gtk_tree_store_set(treestore, &iter_sys, 79 gtk_tree_store_set(treestore, &iter_sys,
75 COL_EVENT, event->system, 80 COL_EVENT, event->system,
81 COL_ACTIVE, TRUE,
76 -1); 82 -1);
77 last_system = event->system; 83 last_system = event->system;
78 } 84 }
@@ -80,6 +86,7 @@ create_tree_event_model(GtkWidget *tree_view)
80 gtk_tree_store_append(treestore, &iter_events, &iter_sys); 86 gtk_tree_store_append(treestore, &iter_events, &iter_sys);
81 gtk_tree_store_set(treestore, &iter_events, 87 gtk_tree_store_set(treestore, &iter_events,
82 COL_EVENT, event->name, 88 COL_EVENT, event->name,
89 COL_ACTIVE, FALSE,
83 -1); 90 -1);
84 91
85 } 92 }
@@ -87,10 +94,134 @@ create_tree_event_model(GtkWidget *tree_view)
87 return GTK_TREE_MODEL(treestore); 94 return GTK_TREE_MODEL(treestore);
88} 95}
89 96
97static void update_active_events(GtkTreeModel *model, GtkTreeIter *parent,
98 gboolean active)
99{
100 GtkTreeIter event;
101
102 if (!gtk_tree_model_iter_children(model, &event, parent))
103 return;
104
105 for (;;) {
106 gtk_tree_store_set(GTK_TREE_STORE(model), &event,
107 COL_ACTIVE, active,
108 -1);
109
110 if (!gtk_tree_model_iter_next(model, &event))
111 break;
112 }
113}
114
115static void update_active_systems(GtkTreeModel *model, GtkTreeIter *parent,
116 gboolean active)
117{
118 GtkTreeIter sys;
119
120 if (!gtk_tree_model_iter_children(model, &sys, parent))
121 return;
122
123 for (;;) {
124 gtk_tree_store_set(GTK_TREE_STORE(model), &sys,
125 COL_ACTIVE, active,
126 -1);
127
128 update_active_events(model, &sys, active);
129
130 if (!gtk_tree_model_iter_next(model, &sys))
131 break;
132 }
133}
134
135static void event_cursor_changed(GtkTreeView *treeview, gpointer data)
136{
137 GtkTreeModel *model;
138 GtkTreePath *path;
139 GtkTreeIter iter, parent, grandparent;
140 gboolean active, start;
141 gint depth;
142
143 model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
144 if (!model)
145 return;
146
147 gtk_tree_view_get_cursor(treeview, &path, NULL);
148 if (!path)
149 return;
150
151 if (!gtk_tree_model_get_iter(model, &iter, path))
152 goto free;
153
154 depth = gtk_tree_path_get_depth(path);
155
156 if (depth == 1) {
157 /*
158 * The first time we start up, the cursor will
159 * select the "All Events" row, and call
160 * this routine. But we don't want to do anything.
161 * Check and activate.
162 */
163 gtk_tree_model_get(model, &iter,
164 COL_ACTIVE_START, &start,
165 -1);
166 if (!start) {
167 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
168 COL_ACTIVE_START, TRUE,
169 -1);
170 goto free;
171 }
172 }
173
174 gtk_tree_model_get(model, &iter,
175 COL_ACTIVE, &active,
176 -1);
177
178 active = active ? FALSE : TRUE;
179
180 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
181 COL_ACTIVE, active,
182 -1);
183
184 if (depth == 1) {
185
186 if (active)
187 /* Set all rows */
188 update_active_systems(model, &iter, TRUE);
189
190 } else if (depth == 2) {
191 if (active) {
192 /* set this system */
193 update_active_events(model, &iter, TRUE);
194 } else {
195 /* disable the all events toggle */
196 gtk_tree_model_iter_parent(model, &parent, &iter);
197 gtk_tree_store_set(GTK_TREE_STORE(model), &parent,
198 COL_ACTIVE, FALSE,
199 -1);
200 }
201
202 } else {
203 if (!active) {
204 /* disable system and all events toggles */
205 gtk_tree_model_iter_parent(model, &parent, &iter);
206 gtk_tree_store_set(GTK_TREE_STORE(model), &parent,
207 COL_ACTIVE, FALSE,
208 -1);
209 gtk_tree_model_iter_parent(model, &grandparent, &parent);
210 gtk_tree_store_set(GTK_TREE_STORE(model), &grandparent,
211 COL_ACTIVE, FALSE,
212 -1);
213 }
214 }
215
216 free:
217 gtk_tree_path_free(path);
218}
219
90static GtkWidget *create_event_list_view(GtkWidget *tree_view) 220static GtkWidget *create_event_list_view(GtkWidget *tree_view)
91{ 221{
92 GtkTreeViewColumn *col; 222 GtkTreeViewColumn *col;
93 GtkCellRenderer *renderer; 223 GtkCellRenderer *renderer;
224 GtkCellRenderer *togrend;
94 GtkWidget *view; 225 GtkWidget *view;
95 GtkTreeModel *model; 226 GtkTreeModel *model;
96 227
@@ -106,7 +237,11 @@ static GtkWidget *create_event_list_view(GtkWidget *tree_view)
106 237
107 renderer = gtk_cell_renderer_text_new(); 238 renderer = gtk_cell_renderer_text_new();
108 239
109 gtk_tree_view_column_pack_start(col, renderer, TRUE); 240 togrend = gtk_cell_renderer_toggle_new();
241
242 gtk_tree_view_column_pack_start(col, togrend, FALSE);
243 gtk_tree_view_column_pack_start(col, renderer, FALSE);
244 gtk_tree_view_column_add_attribute(col, togrend, "active", COL_ACTIVE);
110 245
111 gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT); 246 gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT);
112 247
@@ -117,14 +252,17 @@ static GtkWidget *create_event_list_view(GtkWidget *tree_view)
117 g_object_unref(model); 252 g_object_unref(model);
118 253
119 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), 254 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
120 GTK_SELECTION_MULTIPLE); 255 GTK_SELECTION_NONE);
121 256
122 gtk_tree_view_expand_all(GTK_TREE_VIEW(view)); 257 gtk_tree_view_expand_all(GTK_TREE_VIEW(view));
123 258
259 g_signal_connect_swapped (view, "cursor-changed",
260 G_CALLBACK (event_cursor_changed),
261 (gpointer) view);
262
124 return view; 263 return view;
125} 264}
126 265
127
128/* Callback for the clicked signal of the Events filter button */ 266/* Callback for the clicked signal of the Events filter button */
129static void 267static void
130event_dialog_response (gpointer data, gint response_id) 268event_dialog_response (gpointer data, gint response_id)