blob: de6bd1253fef219eaadbeca91170bc404e8c0c3c [file] [log] [blame]
#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;
}