| #define _GNU_SOURCE |
| #include <gtk/gtk.h> |
| #include <getopt.h> |
| #include <string.h> |
| |
| #include "trace-cmd.h" |
| #include "trace-graph.h" |
| |
| #define version "0.1.1" |
| |
| #define TRACE_WIDTH 800 |
| #define TRACE_HEIGHT 600 |
| |
| #define default_input_file "trace.dat" |
| static char *input_file = default_input_file; |
| static struct graph_info *ginfo; |
| |
| void usage(char *prog) |
| { |
| printf("Usage: %s\n", prog); |
| printf(" -h Display this help message\n"); |
| printf(" -i input_file, default is %s\n", default_input_file); |
| } |
| |
| /* Callback for the clicked signal of the Exit button */ |
| static void |
| exit_clicked (GtkWidget *widget, gpointer data) |
| { |
| gtk_widget_destroy (GTK_WIDGET (data)); /* the user data points to the main window */ |
| tracecmd_close(ginfo->handle); |
| gtk_main_quit (); |
| } |
| |
| /* Callback for the delete_event signal of the main application window */ |
| static gint |
| delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) |
| { |
| gtk_widget_destroy (widget); /* destroy the main window */ |
| tracecmd_close(ginfo->handle); |
| gtk_main_quit (); |
| return TRUE; |
| } |
| |
| void trace_graph(int argc, char **argv) |
| { |
| struct tracecmd_input *handle; |
| GtkWidget *window; |
| GtkWidget *vbox; |
| GtkWidget *hbox; |
| GtkWidget *menu_bar; |
| GtkWidget *menu; |
| GtkWidget *menu_item; |
| GtkWidget *sub_item; |
| GtkWidget *widget; |
| int c; |
| |
| while ((c = getopt(argc, argv, "hi:")) != -1) { |
| switch(c) { |
| case 'h': |
| usage(basename(argv[0])); |
| return; |
| case 'i': |
| input_file = optarg; |
| break; |
| default: |
| /* assume the other options are for gtk */ |
| break; |
| } |
| } |
| |
| handle = tracecmd_open(input_file); |
| |
| if (!handle) |
| die("error reading header"); |
| |
| if (tracecmd_read_headers(handle) < 0) |
| return; |
| |
| if (tracecmd_init_data(handle) < 0) |
| die("failed to init data"); |
| |
| gtk_init(&argc, &argv); |
| |
| /* --- Main window --- */ |
| |
| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| |
| /* --- Top Level Vbox --- */ |
| |
| vbox = gtk_vbox_new(FALSE, 0); |
| gtk_container_add(GTK_CONTAINER (window), vbox); |
| gtk_widget_show(vbox); |
| |
| /* --- Menu Bar --- */ |
| |
| menu_bar = gtk_menu_bar_new(); |
| gtk_box_pack_start(GTK_BOX (vbox), menu_bar, FALSE, FALSE, 0); |
| gtk_widget_show(menu_bar); |
| |
| /* --- File Option --- */ |
| |
| menu_item = gtk_menu_item_new_with_label("File"); |
| gtk_widget_show(menu_item); |
| |
| gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), menu_item); |
| |
| menu = gtk_menu_new(); /* Don't need to show menus */ |
| |
| |
| /* --- File - Quit Option --- */ |
| |
| sub_item = gtk_menu_item_new_with_label("Quit"); |
| |
| /* Add them to the menu */ |
| gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); |
| |
| /* We can attach the Quit menu item to our exit function */ |
| g_signal_connect_swapped (G_OBJECT (sub_item), "activate", |
| G_CALLBACK (exit_clicked), |
| (gpointer) window); |
| |
| /* We do need to show menu items */ |
| gtk_widget_show(sub_item); |
| |
| gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); |
| |
| /* --- end File options --- */ |
| |
| |
| /* --- Top Level Hbox --- */ |
| |
| hbox = gtk_hbox_new(FALSE, 0); |
| gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); |
| gtk_widget_show(hbox); |
| |
| |
| /* --- Set up the Graph --- */ |
| |
| ginfo = trace_graph_create(handle); |
| widget = trace_graph_get_window(ginfo); |
| gtk_box_pack_start(GTK_BOX (hbox), widget, TRUE, TRUE, 0); |
| gtk_widget_show(widget); |
| |
| |
| /********************************************** |
| * Main Window |
| **********************************************/ |
| |
| /* Connect to the delete_event signal and Run the application */ |
| |
| gtk_signal_connect (GTK_OBJECT (window), "delete_event", |
| (GtkSignalFunc) delete_event, |
| NULL); |
| |
| gtk_widget_set_size_request(window, TRACE_WIDTH, TRACE_HEIGHT); |
| |
| gtk_widget_show (window); |
| gtk_main (); |
| } |
| |
| int main(int argc, char **argv) |
| { |
| trace_graph(argc, argv); |
| return 0; |
| } |