aboutsummaryrefslogtreecommitdiffstats
path: root/kernel-shark.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel-shark.c')
-rw-r--r--kernel-shark.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/kernel-shark.c b/kernel-shark.c
index 9ae90bc..7ae562c 100644
--- a/kernel-shark.c
+++ b/kernel-shark.c
@@ -27,6 +27,7 @@
27#include <sys/stat.h> 27#include <sys/stat.h>
28#include <unistd.h> 28#include <unistd.h>
29#include <gtk/gtk.h> 29#include <gtk/gtk.h>
30#include <errno.h>
30#include <getopt.h> 31#include <getopt.h>
31 32
32#include "trace-compat.h" 33#include "trace-compat.h"
@@ -49,9 +50,16 @@
49#define TRACE_WIDTH 800 50#define TRACE_WIDTH 800
50#define TRACE_HEIGHT 600 51#define TRACE_HEIGHT 600
51 52
53#define DIALOG_WIDTH 500
54#define DIALOG_HEIGHT 550
55
52#define default_input_file "trace.dat" 56#define default_input_file "trace.dat"
53static char *input_file; 57static char *input_file;
54 58
59static GtkWidget *statusbar;
60static GtkWidget *statuspix;
61static GString *statusstr;
62
55void usage(char *prog) 63void usage(char *prog)
56{ 64{
57 printf("Usage: %s\n", prog); 65 printf("Usage: %s\n", prog);
@@ -60,6 +68,34 @@ void usage(char *prog)
60 printf(" -i input_file, default is %s\n", default_input_file); 68 printf(" -i input_file, default is %s\n", default_input_file);
61} 69}
62 70
71void pr_stat(char *fmt, ...)
72{
73 GString *str;
74 va_list ap;
75
76 if (!statusstr) {
77 statusstr = g_string_new("");
78 if (!statusstr)
79 die("Allocating status string");
80 }
81
82 str = g_string_new("");
83
84 va_start(ap, fmt);
85 g_string_vprintf(str, fmt, ap);
86 va_end(ap);
87
88 g_string_append_printf(statusstr, "%s\n", str->str);
89
90 if (statusbar) {
91 gtk_statusbar_push(GTK_STATUSBAR(statusbar), 1, str->str);
92 gtk_widget_show(statuspix);
93 }
94
95 g_string_free(str, TRUE);
96}
97
98
63/* graph callbacks */ 99/* graph callbacks */
64 100
65/* convert_nano() and print_time() are copied from trace-graph.c for debugging 101/* convert_nano() and print_time() are copied from trace-graph.c for debugging
@@ -715,6 +751,81 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
715 return FALSE; 751 return FALSE;
716} 752}
717 753
754static void
755status_display_clicked (gpointer data)
756{
757 GtkWidget *dialog;
758 GtkWidget *scrollwin;
759 GtkWidget *viewport;
760 GtkWidget *textview;
761 GtkTextBuffer *buffer;
762
763 dialog = gtk_dialog_new_with_buttons("Status",
764 NULL,
765 GTK_DIALOG_MODAL,
766 "OK",
767 GTK_RESPONSE_ACCEPT,
768 NULL);
769
770 scrollwin = gtk_scrolled_window_new(NULL, NULL);
771 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
772 GTK_POLICY_AUTOMATIC,
773 GTK_POLICY_AUTOMATIC);
774 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0);
775 gtk_widget_show(scrollwin);
776
777 viewport = gtk_viewport_new(NULL, NULL);
778 gtk_widget_show(viewport);
779
780 gtk_container_add(GTK_CONTAINER(scrollwin), viewport);
781
782 textview = gtk_text_view_new();
783 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
784 gtk_text_buffer_set_text(buffer, statusstr->str, -1);
785
786 gtk_container_add(GTK_CONTAINER(viewport), textview);
787 gtk_widget_show(textview);
788
789 gtk_widget_set_size_request(GTK_WIDGET(dialog),
790 DIALOG_WIDTH, DIALOG_HEIGHT);
791
792 gtk_dialog_run(GTK_DIALOG(dialog));
793
794 gtk_widget_destroy(dialog);
795}
796
797static gboolean
798do_status_popup(GtkWidget *widget, GdkEventButton *event, gpointer data)
799{
800 static GtkWidget *menu;
801 static GtkWidget *menu_status_display;
802
803 if (!menu) {
804 menu = gtk_menu_new();
805 menu_status_display = gtk_menu_item_new_with_label("Display Status");
806 gtk_widget_show(menu_status_display);
807 gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_status_display);
808
809 g_signal_connect_swapped (G_OBJECT (menu_status_display), "activate",
810 G_CALLBACK (status_display_clicked),
811 data);
812 }
813
814 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3,
815 gtk_get_current_event_time());
816
817 return TRUE;
818}
819
820static gboolean
821button_press_status(GtkWidget *widget, GdkEventButton *event, gpointer data)
822{
823 if (event->button == 1)
824 return do_status_popup(widget, event, data);
825
826 return FALSE;
827}
828
718void kernel_shark(int argc, char **argv) 829void kernel_shark(int argc, char **argv)
719{ 830{
720 struct tracecmd_input *handle; 831 struct tracecmd_input *handle;
@@ -734,6 +845,7 @@ void kernel_shark(int argc, char **argv)
734 GtkWidget *label; 845 GtkWidget *label;
735 GtkWidget *spin; 846 GtkWidget *spin;
736 GtkWidget *check; 847 GtkWidget *check;
848 GtkWidget *eventbox;
737 int ret; 849 int ret;
738 int c; 850 int c;
739 851
@@ -1187,6 +1299,28 @@ void kernel_shark(int argc, char **argv)
1187 1299
1188 gtk_widget_show(info->treeview); 1300 gtk_widget_show(info->treeview);
1189 1301
1302 /* --- Set up Status Bar --- */
1303
1304 statusbar = gtk_statusbar_new();
1305
1306 gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
1307 gtk_widget_show(statusbar);
1308
1309 statuspix = gtk_image_new_from_stock(GTK_STOCK_INFO,
1310 GTK_ICON_SIZE_SMALL_TOOLBAR);
1311
1312 eventbox = gtk_event_box_new();
1313 gtk_container_add(GTK_CONTAINER(eventbox), statuspix);
1314 gtk_widget_show(eventbox);
1315
1316 gtk_box_pack_end(GTK_BOX(statusbar), eventbox, FALSE, FALSE, 0);
1317
1318 if (statusstr)
1319 gtk_widget_show(statuspix);
1320
1321 gtk_signal_connect(GTK_OBJECT(eventbox), "button_press_event",
1322 (GtkSignalFunc) button_press_status, info);
1323
1190 1324
1191 /********************************************** 1325 /**********************************************
1192 * Main Window 1326 * Main Window