aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile8
-rw-r--r--trace-filter.c171
-rw-r--r--trace-local.h6
-rw-r--r--trace-view.c71
4 files changed, 236 insertions, 20 deletions
diff --git a/Makefile b/Makefile
index 0287721..8d4e48d 100644
--- a/Makefile
+++ b/Makefile
@@ -22,15 +22,19 @@ all: $(TARGETS)
22 22
23LIB_FILE = libtracecmd.a 23LIB_FILE = libtracecmd.a
24 24
25HEADERS = parse-events.h trace-cmd.h 25HEADERS = parse-events.h trace-cmd.h trace-local.h
26 26
27trace-read.o:: $(HEADERS) 27trace-read.o:: $(HEADERS)
28trace-cmd.o:: $(HEADERS) $(LIB_FILE) 28trace-cmd.o:: $(HEADERS) $(LIB_FILE)
29trace-util.o:: $(HEADERS) 29trace-util.o:: $(HEADERS)
30trace-ftrace.o:: $(HEADERS) 30trace-ftrace.o:: $(HEADERS)
31trace-input.o:: $(HEADERS) 31trace-input.o:: $(HEADERS)
32trace-view.o:: $(HEADERS)
33trace-view-store.o:: $(HEADERS)
34trace-filter.o:: $(HEADERS)
32 35
33trace-cmd:: trace-cmd.o trace-read.o trace-view.o trace-view-store.o 36trace-cmd:: trace-cmd.o trace-read.o trace-view.o trace-view-store.o \
37 trace-filter.o
34 $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS) 38 $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS)
35 39
36.PHONY: view_depends 40.PHONY: view_depends
diff --git a/trace-filter.c b/trace-filter.c
new file mode 100644
index 0000000..2e69714
--- /dev/null
+++ b/trace-filter.c
@@ -0,0 +1,171 @@
1#include <gtk/gtk.h>
2#include <string.h>
3
4#include "trace-cmd.h"
5#include "trace-local.h"
6#include "trace-view-store.h"
7
8#define EVENT_DIALOG_WIDTH 400
9#define EVENT_DIALOG_HEIGHT 600
10
11struct dialog_helper {
12 GtkWidget *dialog;
13 GtkWidget *trace_tree;
14};
15
16enum {
17 COL_EVENT,
18 NUM_EVENT_COLS,
19};
20
21static GtkTreeModel *
22create_tree_event_model(GtkWidget *tree_view)
23{
24 GtkTreeModel *model;
25 TraceViewStore *trace_view;
26 GtkTreeStore *treestore;
27 GtkTreeIter iter_all, iter_sys, iter_events;
28 struct pevent *pevent;
29 struct event **events;
30 struct event *event;
31 char *last_system = NULL;
32 gint i;
33
34 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
35 trace_view = TRACE_VIEW_STORE(model);
36
37 pevent = tracecmd_get_pevent(trace_view->handle);
38
39 treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING);
40
41 gtk_tree_store_append(treestore, &iter_all, NULL);
42 gtk_tree_store_set(treestore, &iter_all,
43 COL_EVENT, "All",
44 -1);
45
46 events = pevent_list_events(pevent, EVENT_SORT_SYSTEM);
47 if (!event)
48 return GTK_TREE_MODEL(treestore);
49
50 for (i = 0; events[i]; i++) {
51 event = events[i];
52 if (!last_system || strcmp(last_system, event->system) != 0) {
53 gtk_tree_store_append(treestore, &iter_sys, &iter_all);
54 gtk_tree_store_set(treestore, &iter_sys,
55 COL_EVENT, event->system,
56 -1);
57 last_system = event->system;
58 }
59
60 gtk_tree_store_append(treestore, &iter_events, &iter_sys);
61 gtk_tree_store_set(treestore, &iter_events,
62 COL_EVENT, event->name,
63 -1);
64
65 }
66
67 return GTK_TREE_MODEL(treestore);
68}
69
70static GtkWidget *create_event_list_view(GtkWidget *tree_view)
71{
72 GtkTreeViewColumn *col;
73 GtkCellRenderer *renderer;
74 GtkWidget *view;
75 GtkTreeModel *model;
76
77 view = gtk_tree_view_new();
78
79 /* --- events column --- */
80
81 col = gtk_tree_view_column_new();
82
83 gtk_tree_view_column_set_title(col, "Events");
84
85 gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
86
87 renderer = gtk_cell_renderer_text_new();
88
89 gtk_tree_view_column_pack_start(col, renderer, TRUE);
90
91 gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT);
92
93 model = create_tree_event_model(tree_view);
94
95 gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
96
97 g_object_unref(model);
98
99 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
100 GTK_SELECTION_MULTIPLE);
101
102 gtk_tree_view_expand_all(GTK_TREE_VIEW(view));
103
104 return view;
105}
106
107
108/* Callback for the clicked signal of the Events filter button */
109static void
110event_dialog_response (gpointer data, gint response_id)
111{
112 struct dialog_helper *helper = data;
113
114 switch (response_id) {
115 case GTK_RESPONSE_ACCEPT:
116 printf("accept!\n");
117 break;
118 case GTK_RESPONSE_REJECT:
119 printf("reject!\n");
120 break;
121 default:
122 break;
123 };
124
125 gtk_widget_destroy(GTK_WIDGET(helper->dialog));
126
127 g_free(helper);
128}
129
130void trace_filter_event_dialog(void *trace_tree)
131{
132 GtkWidget *tree_view = GTK_WIDGET(trace_tree);
133 struct dialog_helper *helper;
134 GtkWidget *dialog;
135 GtkWidget *scrollwin;
136 GtkWidget *view;
137
138// trace_view = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
139
140 helper = g_malloc(sizeof(*helper));
141
142 /* --- Make dialog window --- */
143
144 dialog = gtk_dialog_new_with_buttons("Filter Events",
145 NULL,
146 GTK_DIALOG_MODAL,
147 "Accept",
148 GTK_RESPONSE_ACCEPT,
149 GTK_STOCK_CANCEL,
150 GTK_RESPONSE_REJECT,
151 NULL);
152
153 helper->dialog = dialog;
154 helper->trace_tree = tree_view;
155
156 /* We can attach the Quit menu item to our exit function */
157 g_signal_connect_swapped (dialog, "response",
158 G_CALLBACK (event_dialog_response),
159 (gpointer) helper);
160
161 scrollwin = gtk_scrolled_window_new(NULL, NULL);
162 view = create_event_list_view(tree_view);
163
164 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0);
165 gtk_container_add(GTK_CONTAINER(scrollwin), view);
166
167 gtk_widget_set_size_request(GTK_WIDGET(dialog),
168 EVENT_DIALOG_WIDTH, EVENT_DIALOG_HEIGHT);
169
170 gtk_widget_show_all(dialog);
171}
diff --git a/trace-local.h b/trace-local.h
index 4b3deff..94b61c3 100644
--- a/trace-local.h
+++ b/trace-local.h
@@ -13,4 +13,10 @@ int read_trace_files(void);
13void trace_report(int argc, char **argv); 13void trace_report(int argc, char **argv);
14void trace_view(int argc, char **argv); 14void trace_view(int argc, char **argv);
15 15
16
17/* GUI */
18
19/* We use void because this can be used by non gtk files */
20void trace_filter_event_dialog(void *traceview);
21
16#endif /* __TRACE_LOCAL_H */ 22#endif /* __TRACE_LOCAL_H */
diff --git a/trace-view.c b/trace-view.c
index e7e1c99..d756533 100644
--- a/trace-view.c
+++ b/trace-view.c
@@ -43,8 +43,6 @@ enum {
43 NUM_COLS 43 NUM_COLS
44}; 44};
45 45
46struct tracecmd_input *trace_handle;
47
48GtkWidget *trace_tree; 46GtkWidget *trace_tree;
49 47
50/* Callback for the clicked signal of the Exit button */ 48/* Callback for the clicked signal of the Exit button */
@@ -64,6 +62,15 @@ delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
64 return TRUE; 62 return TRUE;
65} 63}
66 64
65/* Callback for the clicked signal of the Events filter button */
66static void
67events_clicked (gpointer data)
68{
69 GtkWidget *trace_tree = data;
70
71 trace_filter_event_dialog(trace_tree);
72}
73
67static GtkTreeModel * 74static GtkTreeModel *
68create_trace_view_model(struct tracecmd_input *handle) 75create_trace_view_model(struct tracecmd_input *handle)
69{ 76{
@@ -74,15 +81,13 @@ create_trace_view_model(struct tracecmd_input *handle)
74 return GTK_TREE_MODEL(store); 81 return GTK_TREE_MODEL(store);
75} 82}
76 83
77static GtkWidget * 84static void
78create_trace_view(struct tracecmd_input *handle) 85load_trace_view(GtkWidget *view, struct tracecmd_input *handle)
79{ 86{
80 GtkTreeViewColumn *col; 87 GtkTreeViewColumn *col;
81 GtkCellRenderer *renderer; 88 GtkCellRenderer *renderer;
82 GtkWidget *view;
83 GtkTreeModel *model; 89 GtkTreeModel *model;
84 90
85 view = gtk_tree_view_new();
86 91
87 /* --- CPU column --- */ 92 /* --- CPU column --- */
88 93
@@ -144,8 +149,6 @@ create_trace_view(struct tracecmd_input *handle)
144 gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); 149 gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
145 150
146 g_object_unref(model); /* destroy model automatically with view */ 151 g_object_unref(model); /* destroy model automatically with view */
147
148 return view;
149} 152}
150 153
151void trace_view(int argc, char **argv) 154void trace_view(int argc, char **argv)
@@ -157,7 +160,7 @@ void trace_view(int argc, char **argv)
157 GtkWidget *menu_bar; 160 GtkWidget *menu_bar;
158 GtkWidget *menu; 161 GtkWidget *menu;
159 GtkWidget *menu_item; 162 GtkWidget *menu_item;
160 GtkWidget *quit_item; 163 GtkWidget *sub_item;
161 GtkWidget *scrollwin; 164 GtkWidget *scrollwin;
162 165
163 handle = read_trace_header(); 166 handle = read_trace_header();
@@ -170,14 +173,16 @@ void trace_view(int argc, char **argv)
170 if (tracecmd_init_data(handle) < 0) 173 if (tracecmd_init_data(handle) < 0)
171 die("failed to init data"); 174 die("failed to init data");
172 175
173 trace_handle = handle;
174
175 gnome_init("trace-cmd", version, argc, argv); 176 gnome_init("trace-cmd", version, argc, argv);
176 177
177 /* --- Main window --- */ 178 /* --- Main window --- */
178 179
179 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 180 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
180 181
182 /* --- Get handle for trace view first --- */
183
184 trace_tree = gtk_tree_view_new();
185
181 /* --- Top Level Vbox --- */ 186 /* --- Top Level Vbox --- */
182 187
183 vbox = gtk_vbox_new(FALSE, 0); 188 vbox = gtk_vbox_new(FALSE, 0);
@@ -200,23 +205,53 @@ void trace_view(int argc, char **argv)
200 menu = gtk_menu_new(); /* Don't need to show menus */ 205 menu = gtk_menu_new(); /* Don't need to show menus */
201 206
202 207
203 /* --- Quit Option --- */ 208 /* --- File - Quit Option --- */
204 209
205 quit_item = gtk_menu_item_new_with_label("Quit"); 210 sub_item = gtk_menu_item_new_with_label("Quit");
206 211
207 /* Add them to the menu */ 212 /* Add them to the menu */
208 gtk_menu_shell_append(GTK_MENU_SHELL (menu), quit_item); 213 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
209 214
210 /* We can attach the Quit menu item to our exit function */ 215 /* We can attach the Quit menu item to our exit function */
211 g_signal_connect_swapped (G_OBJECT (quit_item), "activate", 216 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
212 G_CALLBACK (exit_clicked), 217 G_CALLBACK (exit_clicked),
213 (gpointer) window); 218 (gpointer) window);
214 219
215 /* We do need to show menu items */ 220 /* We do need to show menu items */
216 gtk_widget_show(quit_item); 221 gtk_widget_show(sub_item);
222
223 gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu);
224
225 /* --- end File options --- */
217 226
218 227
228 /* --- Filter Option --- */
229
230 menu_item = gtk_menu_item_new_with_label("Filter");
231 gtk_widget_show(menu_item);
232
233 gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), menu_item);
234
235 menu = gtk_menu_new(); /* Don't need to show menus */
236
237
238 /* --- Filter - Events Option --- */
239
240 sub_item = gtk_menu_item_new_with_label("events");
241
242 /* Add them to the menu */
243 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
244
245 /* We can attach the Quit menu item to our exit function */
246 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
247 G_CALLBACK (events_clicked),
248 (gpointer) trace_tree);
249
250 /* We do need to show menu items */
251 gtk_widget_show(sub_item);
252
219 gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); 253 gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu);
254
220 /* --- Top Level Hbox --- */ 255 /* --- Top Level Hbox --- */
221 256
222 hbox = gtk_hbox_new(FALSE, 0); 257 hbox = gtk_hbox_new(FALSE, 0);
@@ -231,9 +266,9 @@ void trace_view(int argc, char **argv)
231 gtk_box_pack_start(GTK_BOX (hbox), scrollwin, TRUE, TRUE, 0); 266 gtk_box_pack_start(GTK_BOX (hbox), scrollwin, TRUE, TRUE, 0);
232 gtk_widget_show(scrollwin); 267 gtk_widget_show(scrollwin);
233 268
234 /* --- Trace Tree --- */ 269 /* --- Set up Trace Tree --- */
235 270
236 trace_tree = create_trace_view(handle); 271 load_trace_view(trace_tree, handle);
237 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollwin), 272 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollwin),
238 trace_tree); 273 trace_tree);
239 gtk_widget_show(trace_tree); 274 gtk_widget_show(trace_tree);