1*08b48e0bSAndroid Build Coastguard Worker #include <gtk/gtk.h>
2*08b48e0bSAndroid Build Coastguard Worker #include <gtk/gtkx.h>
3*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
4*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
5*08b48e0bSAndroid Build Coastguard Worker
6*08b48e0bSAndroid Build Coastguard Worker char USAGE[] =
7*08b48e0bSAndroid Build Coastguard Worker "is a helper utility for rendering the GNUplot graphs in a GTK window. This allows to real time resizing, scrolling, and cursor positioning features while viewing the graph. This utility also provides options to hide graphs using check buttons.\n \
8*08b48e0bSAndroid Build Coastguard Worker \n \
9*08b48e0bSAndroid Build Coastguard Worker Usage:\n \
10*08b48e0bSAndroid Build Coastguard Worker -h, --help Show this help menu\n \
11*08b48e0bSAndroid Build Coastguard Worker \n \
12*08b48e0bSAndroid Build Coastguard Worker NOTE: This utility is not meant to be used standalone. Never run this utility directly. Always run afl-plot, which will, in turn, invoke this utility (when run using `-g` or `--graphical` flag).\n \
13*08b48e0bSAndroid Build Coastguard Worker ";
14*08b48e0bSAndroid Build Coastguard Worker
15*08b48e0bSAndroid Build Coastguard Worker static void plot_toggled(GtkWidget *caller, gpointer data);
16*08b48e0bSAndroid Build Coastguard Worker
main(int argc,char ** argv)17*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
18*08b48e0bSAndroid Build Coastguard Worker
19*08b48e0bSAndroid Build Coastguard Worker if (argc == 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-help"))) {
20*08b48e0bSAndroid Build Coastguard Worker
21*08b48e0bSAndroid Build Coastguard Worker printf("%s %s", argv[0], USAGE);
22*08b48e0bSAndroid Build Coastguard Worker return EXIT_SUCCESS;
23*08b48e0bSAndroid Build Coastguard Worker
24*08b48e0bSAndroid Build Coastguard Worker }
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker GtkWidget *window;
27*08b48e0bSAndroid Build Coastguard Worker GtkWidget *main_vbox;
28*08b48e0bSAndroid Build Coastguard Worker
29*08b48e0bSAndroid Build Coastguard Worker GtkWidget *cbuttons_frame;
30*08b48e0bSAndroid Build Coastguard Worker GtkWidget *cbuttons_hbox;
31*08b48e0bSAndroid Build Coastguard Worker
32*08b48e0bSAndroid Build Coastguard Worker GtkWidget *separator_top;
33*08b48e0bSAndroid Build Coastguard Worker GtkWidget *pane1, *pane2, *pane3;
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker GtkWidget *plots_vbox;
36*08b48e0bSAndroid Build Coastguard Worker GtkWidget *plot_edges_frame, *plot_exec_speed_frame, *plot_high_freq_frame,
37*08b48e0bSAndroid Build Coastguard Worker *plot_low_freq_frame;
38*08b48e0bSAndroid Build Coastguard Worker GtkWidget *plot_edges, *plot_exec_speed, *plot_high_freq, *plot_low_freq;
39*08b48e0bSAndroid Build Coastguard Worker
40*08b48e0bSAndroid Build Coastguard Worker gtk_init(&argc, &argv);
41*08b48e0bSAndroid Build Coastguard Worker
42*08b48e0bSAndroid Build Coastguard Worker window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
43*08b48e0bSAndroid Build Coastguard Worker gtk_window_set_title(GTK_WINDOW(window), "Graph drawing");
44*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(window), 10);
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard Worker cbuttons_frame = gtk_frame_new("Select the plots");
49*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(cbuttons_frame), 5);
50*08b48e0bSAndroid Build Coastguard Worker
51*08b48e0bSAndroid Build Coastguard Worker cbuttons_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
52*08b48e0bSAndroid Build Coastguard Worker
53*08b48e0bSAndroid Build Coastguard Worker GtkWidget *cbutton_edges, *cbutton_exec_speed, *cbutton_high_freq,
54*08b48e0bSAndroid Build Coastguard Worker *cbutton_low_freq;
55*08b48e0bSAndroid Build Coastguard Worker
56*08b48e0bSAndroid Build Coastguard Worker cbutton_edges = gtk_check_button_new_with_label("Edges");
57*08b48e0bSAndroid Build Coastguard Worker gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbutton_edges), TRUE);
58*08b48e0bSAndroid Build Coastguard Worker g_signal_connect(cbutton_edges, "toggled", G_CALLBACK(plot_toggled),
59*08b48e0bSAndroid Build Coastguard Worker &plot_edges_frame);
60*08b48e0bSAndroid Build Coastguard Worker
61*08b48e0bSAndroid Build Coastguard Worker cbutton_exec_speed = gtk_check_button_new_with_label("Execution Speed");
62*08b48e0bSAndroid Build Coastguard Worker gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbutton_exec_speed), TRUE);
63*08b48e0bSAndroid Build Coastguard Worker g_signal_connect(cbutton_exec_speed, "toggled", G_CALLBACK(plot_toggled),
64*08b48e0bSAndroid Build Coastguard Worker &plot_exec_speed_frame);
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker cbutton_high_freq = gtk_check_button_new_with_label("High Frequency");
67*08b48e0bSAndroid Build Coastguard Worker gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbutton_high_freq), TRUE);
68*08b48e0bSAndroid Build Coastguard Worker g_signal_connect(cbutton_high_freq, "toggled", G_CALLBACK(plot_toggled),
69*08b48e0bSAndroid Build Coastguard Worker &plot_high_freq_frame);
70*08b48e0bSAndroid Build Coastguard Worker
71*08b48e0bSAndroid Build Coastguard Worker cbutton_low_freq = gtk_check_button_new_with_label("Low Frequency");
72*08b48e0bSAndroid Build Coastguard Worker gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbutton_low_freq), TRUE);
73*08b48e0bSAndroid Build Coastguard Worker g_signal_connect(cbutton_low_freq, "toggled", G_CALLBACK(plot_toggled),
74*08b48e0bSAndroid Build Coastguard Worker &plot_low_freq_frame);
75*08b48e0bSAndroid Build Coastguard Worker
76*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(cbuttons_hbox), cbutton_edges, TRUE, TRUE, 1);
77*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(cbuttons_hbox), cbutton_exec_speed, TRUE, TRUE, 1);
78*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(cbuttons_hbox), cbutton_high_freq, TRUE, TRUE, 1);
79*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(cbuttons_hbox), cbutton_low_freq, TRUE, TRUE, 1);
80*08b48e0bSAndroid Build Coastguard Worker
81*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(cbuttons_frame), cbuttons_hbox);
82*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(main_vbox), cbuttons_frame, FALSE, TRUE, 1);
83*08b48e0bSAndroid Build Coastguard Worker
84*08b48e0bSAndroid Build Coastguard Worker separator_top = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
85*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(main_vbox), separator_top, FALSE, TRUE, 1);
86*08b48e0bSAndroid Build Coastguard Worker
87*08b48e0bSAndroid Build Coastguard Worker plots_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
88*08b48e0bSAndroid Build Coastguard Worker
89*08b48e0bSAndroid Build Coastguard Worker plot_edges_frame = gtk_frame_new("Edges");
90*08b48e0bSAndroid Build Coastguard Worker gtk_frame_set_shadow_type(GTK_FRAME(plot_edges_frame), GTK_SHADOW_IN);
91*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(plot_edges_frame), 10);
92*08b48e0bSAndroid Build Coastguard Worker plot_edges = gtk_socket_new();
93*08b48e0bSAndroid Build Coastguard Worker gtk_widget_set_size_request(plot_edges, -1, 100);
94*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(plot_edges_frame), plot_edges);
95*08b48e0bSAndroid Build Coastguard Worker
96*08b48e0bSAndroid Build Coastguard Worker plot_exec_speed_frame = gtk_frame_new("Exec Speed");
97*08b48e0bSAndroid Build Coastguard Worker gtk_frame_set_shadow_type(GTK_FRAME(plot_exec_speed_frame), GTK_SHADOW_IN);
98*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(plot_exec_speed_frame), 10);
99*08b48e0bSAndroid Build Coastguard Worker plot_exec_speed = gtk_socket_new();
100*08b48e0bSAndroid Build Coastguard Worker gtk_widget_set_size_request(plot_exec_speed, -1, 100);
101*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(plot_exec_speed_frame), plot_exec_speed);
102*08b48e0bSAndroid Build Coastguard Worker
103*08b48e0bSAndroid Build Coastguard Worker plot_high_freq_frame = gtk_frame_new("High Frequency");
104*08b48e0bSAndroid Build Coastguard Worker gtk_frame_set_shadow_type(GTK_FRAME(plot_high_freq_frame), GTK_SHADOW_IN);
105*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(plot_high_freq_frame), 10);
106*08b48e0bSAndroid Build Coastguard Worker plot_high_freq = gtk_socket_new();
107*08b48e0bSAndroid Build Coastguard Worker gtk_widget_set_size_request(plot_high_freq, -1, 100);
108*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(plot_high_freq_frame), plot_high_freq);
109*08b48e0bSAndroid Build Coastguard Worker
110*08b48e0bSAndroid Build Coastguard Worker plot_low_freq_frame = gtk_frame_new("Low Frequency");
111*08b48e0bSAndroid Build Coastguard Worker gtk_frame_set_shadow_type(GTK_FRAME(plot_low_freq_frame), GTK_SHADOW_IN);
112*08b48e0bSAndroid Build Coastguard Worker gtk_container_set_border_width(GTK_CONTAINER(plot_low_freq_frame), 10);
113*08b48e0bSAndroid Build Coastguard Worker plot_low_freq = gtk_socket_new();
114*08b48e0bSAndroid Build Coastguard Worker gtk_widget_set_size_request(plot_low_freq, -1, 100);
115*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(plot_low_freq_frame), plot_low_freq);
116*08b48e0bSAndroid Build Coastguard Worker
117*08b48e0bSAndroid Build Coastguard Worker pane1 = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
118*08b48e0bSAndroid Build Coastguard Worker pane2 = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
119*08b48e0bSAndroid Build Coastguard Worker pane3 = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
120*08b48e0bSAndroid Build Coastguard Worker
121*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack1(GTK_PANED(pane1), plot_edges_frame, TRUE, FALSE);
122*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack2(GTK_PANED(pane1), plot_exec_speed_frame, TRUE, FALSE);
123*08b48e0bSAndroid Build Coastguard Worker
124*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack1(GTK_PANED(pane2), pane1, TRUE, FALSE);
125*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack2(GTK_PANED(pane2), plot_high_freq_frame, TRUE, FALSE);
126*08b48e0bSAndroid Build Coastguard Worker
127*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack1(GTK_PANED(pane3), pane2, TRUE, FALSE);
128*08b48e0bSAndroid Build Coastguard Worker gtk_paned_pack2(GTK_PANED(pane3), plot_low_freq_frame, TRUE, FALSE);
129*08b48e0bSAndroid Build Coastguard Worker
130*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(plots_vbox), pane3, TRUE, TRUE, 0);
131*08b48e0bSAndroid Build Coastguard Worker
132*08b48e0bSAndroid Build Coastguard Worker gtk_box_pack_start(GTK_BOX(main_vbox), plots_vbox, TRUE, TRUE, 1);
133*08b48e0bSAndroid Build Coastguard Worker
134*08b48e0bSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(window), main_vbox);
135*08b48e0bSAndroid Build Coastguard Worker
136*08b48e0bSAndroid Build Coastguard Worker guint id_edges = gtk_socket_get_id(GTK_SOCKET(plot_edges));
137*08b48e0bSAndroid Build Coastguard Worker guint id_exec_speed = gtk_socket_get_id(GTK_SOCKET(plot_exec_speed));
138*08b48e0bSAndroid Build Coastguard Worker guint id_high_freq = gtk_socket_get_id(GTK_SOCKET(plot_high_freq));
139*08b48e0bSAndroid Build Coastguard Worker guint id_low_freq = gtk_socket_get_id(GTK_SOCKET(plot_low_freq));
140*08b48e0bSAndroid Build Coastguard Worker
141*08b48e0bSAndroid Build Coastguard Worker printf("%x\n%x\n%x\n%x\n", id_edges, id_exec_speed, id_high_freq,
142*08b48e0bSAndroid Build Coastguard Worker id_low_freq);
143*08b48e0bSAndroid Build Coastguard Worker
144*08b48e0bSAndroid Build Coastguard Worker fclose(stdout);
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit),
147*08b48e0bSAndroid Build Coastguard Worker NULL);
148*08b48e0bSAndroid Build Coastguard Worker gtk_widget_show_all(window);
149*08b48e0bSAndroid Build Coastguard Worker gtk_window_maximize(GTK_WINDOW(window));
150*08b48e0bSAndroid Build Coastguard Worker gtk_main();
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Worker return EXIT_SUCCESS;
153*08b48e0bSAndroid Build Coastguard Worker
154*08b48e0bSAndroid Build Coastguard Worker }
155*08b48e0bSAndroid Build Coastguard Worker
plot_toggled(GtkWidget * caller,gpointer data)156*08b48e0bSAndroid Build Coastguard Worker static void plot_toggled(GtkWidget *caller, gpointer data) {
157*08b48e0bSAndroid Build Coastguard Worker
158*08b48e0bSAndroid Build Coastguard Worker gboolean state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(caller));
159*08b48e0bSAndroid Build Coastguard Worker
160*08b48e0bSAndroid Build Coastguard Worker GtkWidget *widget = *(GtkWidget **)data;
161*08b48e0bSAndroid Build Coastguard Worker
162*08b48e0bSAndroid Build Coastguard Worker if (state) {
163*08b48e0bSAndroid Build Coastguard Worker
164*08b48e0bSAndroid Build Coastguard Worker gtk_widget_show(widget);
165*08b48e0bSAndroid Build Coastguard Worker
166*08b48e0bSAndroid Build Coastguard Worker } else {
167*08b48e0bSAndroid Build Coastguard Worker
168*08b48e0bSAndroid Build Coastguard Worker gtk_widget_hide(widget);
169*08b48e0bSAndroid Build Coastguard Worker
170*08b48e0bSAndroid Build Coastguard Worker }
171*08b48e0bSAndroid Build Coastguard Worker
172*08b48e0bSAndroid Build Coastguard Worker }
173*08b48e0bSAndroid Build Coastguard Worker
174