diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-06-18 14:30:42 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-06-18 17:40:52 -0400 |
commit | 4cd56f27508fe3b224824f035903f061e8fccdfb (patch) | |
tree | dda00171e7bdd9cb10d561ebac25b8b9e80a05ba | |
parent | 51717dd4a1a779ac045767d9ccbea5a9a42dcb5c (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.c | 177 |
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 | |||
49 | struct trace_capture { | 52 | struct 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 | ||
460 | static 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 | |||
456 | static void execute_command(struct trace_capture *cap) | 475 | static 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 | ||
685 | static 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 | |||
726 | static 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 | |||
736 | static void | 705 | static void |
737 | file_clicked (GtkWidget *widget, gpointer data) | 706 | file_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 | */ | ||
1063 | static void tracing_dialog(struct shark_info *info, const char *tracing) | 1058 | static 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); |