aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-06-18 14:30:42 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-06-18 17:40:52 -0400
commit4cd56f27508fe3b224824f035903f061e8fccdfb (patch)
treedda00171e7bdd9cb10d561ebac25b8b9e80a05ba
parent51717dd4a1a779ac045767d9ccbea5a9a42dcb5c (diff)
kernelshark: Move the event tree into the capture dialog box
Since the events are a major selection feature of the capture, move the event tree into the main dialog box. Requested-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-capture.c177
1 files changed, 109 insertions, 68 deletions
diff --git a/trace-capture.c b/trace-capture.c
index 0be4c9a..aaa993e 100644
--- a/trace-capture.c
+++ b/trace-capture.c
@@ -46,6 +46,9 @@
46 46
47#define PLUGIN_NONE "NONE" 47#define PLUGIN_NONE "NONE"
48 48
49#define DIALOG_WIDTH 600
50#define DIALOG_HEIGHT 600
51
49struct trace_capture { 52struct trace_capture {
50 struct pevent *pevent; 53 struct pevent *pevent;
51 struct shark_info *info; 54 struct shark_info *info;
@@ -55,6 +58,7 @@ struct trace_capture {
55 GtkWidget *output_text; 58 GtkWidget *output_text;
56 GtkTextBuffer *output_buffer; 59 GtkTextBuffer *output_buffer;
57 GtkWidget *output_dialog; 60 GtkWidget *output_dialog;
61 GtkWidget *event_view;
58 GtkWidget *plugin_combo; 62 GtkWidget *plugin_combo;
59 GtkWidget *stop_dialog; 63 GtkWidget *stop_dialog;
60 pthread_t thread; 64 pthread_t thread;
@@ -453,6 +457,21 @@ static void set_plugin(struct trace_capture *cap)
453 &iter); 457 &iter);
454} 458}
455 459
460static void update_events(struct trace_capture *cap)
461{
462 struct shark_info *info = cap->info;
463
464 if (!cap->event_view)
465 return;
466
467 clear_capture_events(cap);
468
469 trace_extract_event_list_view(cap->event_view,
470 &info->cap_all_events,
471 &info->cap_systems,
472 &info->cap_events);
473}
474
456static void execute_command(struct trace_capture *cap) 475static void execute_command(struct trace_capture *cap)
457{ 476{
458 const gchar *ccommand; 477 const gchar *ccommand;
@@ -464,6 +483,7 @@ static void execute_command(struct trace_capture *cap)
464 int i; 483 int i;
465 484
466 update_plugin(cap); 485 update_plugin(cap);
486 update_events(cap);
467 487
468 ccommand = gtk_entry_get_text(GTK_ENTRY(cap->command_entry)); 488 ccommand = gtk_entry_get_text(GTK_ENTRY(cap->command_entry));
469 if (!ccommand || !strlen(ccommand) || is_just_ws(ccommand)) { 489 if (!ccommand || !strlen(ccommand) || is_just_ws(ccommand)) {
@@ -682,57 +702,6 @@ static int trim_plugins(char **plugins)
682 return len; 702 return len;
683} 703}
684 704
685static void event_filter_callback(gboolean accept,
686 gboolean all_events,
687 gchar **systems,
688 gint *events,
689 gpointer data)
690{
691 struct trace_capture *cap = data;
692 int nr_sys, nr_events;
693 int i;
694
695 if (!accept)
696 return;
697
698 clear_capture_events(cap);
699
700 if (all_events) {
701 cap->info->cap_all_events = TRUE;
702 return;
703 }
704
705 if (systems) {
706 for (nr_sys = 0; systems[nr_sys]; nr_sys++)
707 ;
708 cap->info->cap_systems = malloc_or_die(sizeof(*cap->info->cap_systems) *
709 (nr_sys + 1));
710 for (i = 0; i < nr_sys; i++)
711 cap->info->cap_systems[i] = strdup(systems[i]);
712 cap->info->cap_systems[i] = NULL;
713 }
714
715 if (events) {
716 for (nr_events = 0; events[nr_events] >= 0; nr_events++)
717 ;
718 cap->info->cap_events = malloc_or_die(sizeof(*cap->info->cap_events) *
719 (nr_events + 1));
720 for (i = 0; i < nr_events; i++)
721 cap->info->cap_events[i] = events[i];
722 cap->info->cap_events[i] = -1;
723 }
724}
725
726static void event_button_clicked(GtkWidget *widget, gpointer data)
727{
728 struct trace_capture *cap = data;
729 struct pevent *pevent = cap->pevent;
730
731 trace_filter_pevent_dialog(pevent, cap->info->cap_all_events,
732 cap->info->cap_systems, cap->info->cap_events,
733 event_filter_callback, cap);
734}
735
736static void 705static void
737file_clicked (GtkWidget *widget, gpointer data) 706file_clicked (GtkWidget *widget, gpointer data)
738{ 707{
@@ -788,7 +757,7 @@ static void execute_button_clicked(GtkWidget *widget, gpointer data)
788 cap->stop_dialog = dialog; 757 cap->stop_dialog = dialog;
789 758
790 label = gtk_label_new("Hit Stop to end execution"); 759 label = gtk_label_new("Hit Stop to end execution");
791 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0); 760 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, FALSE, 0);
792 gtk_widget_show(label); 761 gtk_widget_show(label);
793 762
794 gtk_signal_connect(GTK_OBJECT (dialog), "delete_event", 763 gtk_signal_connect(GTK_OBJECT (dialog), "delete_event",
@@ -925,8 +894,15 @@ static void load_settings_clicked(GtkWidget *widget, gpointer data)
925 894
926 do { 895 do {
927 name = tracecmd_xml_node_type(syschild); 896 name = tracecmd_xml_node_type(syschild);
928 if (strcmp(name, "Events") == 0) 897 if (strcmp(name, "Events") == 0) {
929 load_cap_events(cap, handle, syschild); 898 load_cap_events(cap, handle, syschild);
899 trace_update_event_view(cap->event_view,
900 cap->pevent,
901 NULL,
902 info->cap_all_events,
903 info->cap_systems,
904 info->cap_events);
905 }
930 906
931 else if (strcmp(name, "Plugin") == 0) { 907 else if (strcmp(name, "Plugin") == 0) {
932 plugin = tracecmd_xml_node_value(handle, syschild); 908 plugin = tracecmd_xml_node_value(handle, syschild);
@@ -1006,6 +982,8 @@ static void save_settings_clicked(GtkWidget *widget, gpointer data)
1006 982
1007 g_free(filename); 983 g_free(filename);
1008 984
985 update_events(cap);
986
1009 tracecmd_xml_start_system(handle, "CaptureSettings"); 987 tracecmd_xml_start_system(handle, "CaptureSettings");
1010 988
1011 tracecmd_xml_start_sub_system(handle, "Events"); 989 tracecmd_xml_start_sub_system(handle, "Events");
@@ -1060,15 +1038,37 @@ static GtkTreeModel *create_plugin_combo_model(gpointer data)
1060 return GTK_TREE_MODEL(list); 1038 return GTK_TREE_MODEL(list);
1061} 1039}
1062 1040
1041/*
1042 * Trace Capture Dialog Window
1043 *
1044 * +--------------------------------------------------------------------+
1045 * | Dialog Window |
1046 * | +-------------------------------+-------------------------------+ |
1047 * | | Paned Window | +---------------------------+ | |
1048 * | | +---------------------------+ | | Scroll window | | |
1049 * | | | Hbox | | | +-----------------------+ | | |
1050 * | | | Label Plugin Combo | | | | Event Tree | | | |
1051 * | | +---------------------------+ | | | | | | |
1052 * | | | | | | | | |
1053 * | | | | +-----------------------+ | | |
1054 * | | | +---------------------------+ | |
1055 * | +-------------------------------+-------------------------------+ |
1056 * +--------------------------------------------------------------------+
1057 */
1063static void tracing_dialog(struct shark_info *info, const char *tracing) 1058static void tracing_dialog(struct shark_info *info, const char *tracing)
1064{ 1059{
1065 struct pevent *pevent; 1060 struct pevent *pevent;
1066 GtkWidget *dialog; 1061 GtkWidget *dialog;
1062 GtkWidget *vbox;
1063 GtkWidget *vbox2;
1067 GtkWidget *button; 1064 GtkWidget *button;
1068 GtkWidget *hbox; 1065 GtkWidget *hbox;
1069 GtkWidget *combo; 1066 GtkWidget *combo;
1070 GtkWidget *label; 1067 GtkWidget *label;
1071 GtkWidget *entry; 1068 GtkWidget *entry;
1069 GtkWidget *hpaned;
1070 GtkWidget *scrollwin;
1071 GtkWidget *event_tree;
1072 char **plugins; 1072 char **plugins;
1073 int nr_plugins; 1073 int nr_plugins;
1074 struct trace_capture cap; 1074 struct trace_capture cap;
@@ -1109,19 +1109,46 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1109 1109
1110 cap.main_dialog = dialog; 1110 cap.main_dialog = dialog;
1111 1111
1112 /* --- Top Level Hpaned --- */
1113
1114 hpaned = gtk_hpaned_new();
1115 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hpaned, TRUE, TRUE, 0);
1116 gtk_widget_show(hpaned);
1117
1118 /* It is possible that no pevents exist. */
1112 if (pevent) { 1119 if (pevent) {
1113 button = gtk_button_new_with_label("Select Events"); 1120 scrollwin = gtk_scrolled_window_new(NULL, NULL);
1114 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), 1121 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
1115 button, TRUE, TRUE, 0); 1122 GTK_POLICY_AUTOMATIC,
1116 gtk_widget_show(button); 1123 GTK_POLICY_AUTOMATIC);
1117 1124
1118 g_signal_connect (button, "clicked", 1125 gtk_paned_add2(GTK_PANED(hpaned), scrollwin);
1119 G_CALLBACK (event_button_clicked), 1126 gtk_widget_show(scrollwin);
1120 (gpointer)&cap); 1127
1128 event_tree = trace_create_event_list_view(pevent, NULL,
1129 cap.info->cap_all_events,
1130 cap.info->cap_systems,
1131 cap.info->cap_events);
1132
1133 gtk_container_add(GTK_CONTAINER(scrollwin), event_tree);
1134 gtk_widget_show(event_tree);
1135
1136 cap.event_view = event_tree;
1137
1138 } else {
1139 /* No events */
1140 label = gtk_label_new("No events enabled on system");
1141 gtk_paned_add2(GTK_PANED(hpaned), label);
1142 gtk_widget_show(label);
1143 cap.event_view = NULL;
1121 } 1144 }
1122 1145
1146 vbox = gtk_vbox_new(TRUE, 0);
1147 gtk_paned_add1(GTK_PANED(hpaned), vbox);
1148 gtk_widget_show(vbox);
1149
1123 hbox = gtk_hbox_new(FALSE, 0); 1150 hbox = gtk_hbox_new(FALSE, 0);
1124 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); 1151 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1125 gtk_widget_show(hbox); 1152 gtk_widget_show(hbox);
1126 1153
1127 combo = trace_create_combo_box(hbox, "Plugin: ", create_plugin_combo_model, plugins); 1154 combo = trace_create_combo_box(hbox, "Plugin: ", create_plugin_combo_model, plugins);
@@ -1130,12 +1157,16 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1130 if (cap.info->cap_plugin) 1157 if (cap.info->cap_plugin)
1131 set_plugin(&cap); 1158 set_plugin(&cap);
1132 1159
1160 vbox2 = gtk_vbox_new(FALSE, 0);
1161 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
1162 gtk_widget_show(vbox2);
1163
1133 label = gtk_label_new("Command:"); 1164 label = gtk_label_new("Command:");
1134 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0); 1165 gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
1135 gtk_widget_show(label); 1166 gtk_widget_show(label);
1136 1167
1137 entry = gtk_entry_new(); 1168 entry = gtk_entry_new();
1138 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, TRUE, TRUE, 0); 1169 gtk_box_pack_start(GTK_BOX(vbox2), entry, FALSE, FALSE, 0);
1139 gtk_widget_show(entry); 1170 gtk_widget_show(entry);
1140 1171
1141 cap.command_entry = entry; 1172 cap.command_entry = entry;
@@ -1144,7 +1175,7 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1144 gtk_entry_set_text(GTK_ENTRY(entry), cap.info->cap_command); 1175 gtk_entry_set_text(GTK_ENTRY(entry), cap.info->cap_command);
1145 1176
1146 hbox = gtk_hbox_new(FALSE, 0); 1177 hbox = gtk_hbox_new(FALSE, 0);
1147 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); 1178 gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, FALSE, 0);
1148 gtk_widget_show(hbox); 1179 gtk_widget_show(hbox);
1149 1180
1150 button = gtk_button_new_with_label("Save file: "); 1181 button = gtk_button_new_with_label("Save file: ");
@@ -1167,8 +1198,9 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1167 gtk_entry_set_text(GTK_ENTRY(entry), file); 1198 gtk_entry_set_text(GTK_ENTRY(entry), file);
1168 cap.file_entry = entry; 1199 cap.file_entry = entry;
1169 1200
1201
1170 button = gtk_button_new_with_label("Execute"); 1202 button = gtk_button_new_with_label("Execute");
1171 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), button, TRUE, TRUE, 0); 1203 gtk_box_pack_start(GTK_BOX(vbox2), button, TRUE, FALSE, 0);
1172 gtk_widget_show(button); 1204 gtk_widget_show(button);
1173 1205
1174 g_signal_connect (button, "clicked", 1206 g_signal_connect (button, "clicked",
@@ -1176,8 +1208,12 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1176 (gpointer)&cap); 1208 (gpointer)&cap);
1177 1209
1178 1210
1211 vbox2 = gtk_vbox_new(FALSE, 0);
1212 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
1213 gtk_widget_show(vbox2);
1214
1179 button = gtk_button_new_with_label("Load Settings"); 1215 button = gtk_button_new_with_label("Load Settings");
1180 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), button, TRUE, TRUE, 0); 1216 gtk_box_pack_start(GTK_BOX(vbox2), button, TRUE, FALSE, 0);
1181 gtk_widget_show(button); 1217 gtk_widget_show(button);
1182 1218
1183 g_signal_connect (button, "clicked", 1219 g_signal_connect (button, "clicked",
@@ -1186,13 +1222,16 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1186 1222
1187 1223
1188 button = gtk_button_new_with_label("Save Settings"); 1224 button = gtk_button_new_with_label("Save Settings");
1189 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), button, TRUE, TRUE, 0); 1225 gtk_box_pack_start(GTK_BOX(vbox2), button, TRUE, FALSE, 0);
1190 gtk_widget_show(button); 1226 gtk_widget_show(button);
1191 1227
1192 g_signal_connect (button, "clicked", 1228 g_signal_connect (button, "clicked",
1193 G_CALLBACK (save_settings_clicked), 1229 G_CALLBACK (save_settings_clicked),
1194 (gpointer)&cap); 1230 (gpointer)&cap);
1195 1231
1232 gtk_widget_set_size_request(GTK_WIDGET(dialog),
1233 DIALOG_WIDTH, DIALOG_HEIGHT);
1234
1196 gtk_widget_show(dialog); 1235 gtk_widget_show(dialog);
1197 gtk_dialog_run(GTK_DIALOG(dialog)); 1236 gtk_dialog_run(GTK_DIALOG(dialog));
1198 1237
@@ -1209,6 +1248,8 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1209 else 1248 else
1210 cap.info->cap_command = NULL; 1249 cap.info->cap_command = NULL;
1211 1250
1251 update_events(&cap);
1252
1212 gtk_widget_destroy(dialog); 1253 gtk_widget_destroy(dialog);
1213 1254
1214 end_capture(&cap); 1255 end_capture(&cap);