diff options
-rw-r--r-- | trace-graph.c | 125 |
1 files changed, 108 insertions, 17 deletions
diff --git a/trace-graph.c b/trace-graph.c index 4a65fb5..e5b22a8 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
@@ -595,6 +595,81 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
595 | return TRUE; | 595 | return TRUE; |
596 | } | 596 | } |
597 | 597 | ||
598 | static gboolean | ||
599 | info_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) | ||
600 | { | ||
601 | struct graph_info *ginfo = data; | ||
602 | |||
603 | printf("hi\n"); | ||
604 | if (event->button != 1) | ||
605 | return FALSE; | ||
606 | |||
607 | /* check for double click */ | ||
608 | if (event->type == GDK_2BUTTON_PRESS) | ||
609 | return FALSE; | ||
610 | |||
611 | ginfo->press_x = 0; | ||
612 | ginfo->last_x = 0; | ||
613 | |||
614 | draw_line(ginfo->draw, 0, ginfo); | ||
615 | |||
616 | ginfo->line_active = TRUE; | ||
617 | |||
618 | return FALSE; | ||
619 | } | ||
620 | |||
621 | static gboolean | ||
622 | info_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) | ||
623 | { | ||
624 | struct graph_info *ginfo = data; | ||
625 | GdkModifierType state; | ||
626 | gint x, y; | ||
627 | |||
628 | if (!ginfo->line_active) | ||
629 | return FALSE; | ||
630 | |||
631 | if (!ginfo->curr_pixmap) | ||
632 | return FALSE; | ||
633 | |||
634 | update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y, | ||
635 | ginfo->cpu_data_w, ginfo->cpu_data_h); | ||
636 | if (event->is_hint) | ||
637 | gdk_window_get_pointer(event->window, &x, &y, &state); | ||
638 | else { | ||
639 | x = event->x; | ||
640 | y = event->y; | ||
641 | } | ||
642 | |||
643 | /* Position x relative to the location in the drawing area */ | ||
644 | x -= ginfo->scrollwin->allocation.x - ginfo->info_scrollwin->allocation.x; | ||
645 | |||
646 | if (x < 0) | ||
647 | return FALSE; | ||
648 | |||
649 | if (ginfo->last_x) | ||
650 | clear_last_line(ginfo->draw, ginfo); | ||
651 | ginfo->last_x = x; | ||
652 | draw_line(ginfo->draw, ginfo->press_x, ginfo); | ||
653 | draw_line(ginfo->draw, x, ginfo); | ||
654 | |||
655 | return FALSE; | ||
656 | } | ||
657 | |||
658 | static void activate_zoom(struct graph_info *ginfo, gint x); | ||
659 | |||
660 | static gboolean | ||
661 | info_button_release_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) | ||
662 | { | ||
663 | struct graph_info *ginfo = data; | ||
664 | gint x; | ||
665 | |||
666 | x = event->x - ginfo->scrollwin->allocation.x - ginfo->info_scrollwin->allocation.x; | ||
667 | |||
668 | activate_zoom(ginfo, x); | ||
669 | |||
670 | return FALSE; | ||
671 | } | ||
672 | |||
598 | static void print_rec_info(struct record *record, struct pevent *pevent, int cpu) | 673 | static void print_rec_info(struct record *record, struct pevent *pevent, int cpu) |
599 | { | 674 | { |
600 | struct trace_seq s; | 675 | struct trace_seq s; |
@@ -1172,26 +1247,32 @@ static void zoom_out_window(struct graph_info *ginfo, gint start, gint end) | |||
1172 | 1247 | ||
1173 | ginfo->hadj_value = start_x; | 1248 | ginfo->hadj_value = start_x; |
1174 | } | 1249 | } |
1250 | static void activate_zoom(struct graph_info *ginfo, gint x) | ||
1251 | { | ||
1252 | |||
1253 | if (!ginfo->line_active) | ||
1254 | return; | ||
1255 | |||
1256 | ginfo->line_active = FALSE; | ||
1257 | clear_last_line(ginfo->draw, ginfo); | ||
1258 | ginfo->last_x = ginfo->press_x; | ||
1259 | clear_last_line(ginfo->draw, ginfo); | ||
1260 | |||
1261 | if (x > ginfo->press_x) { | ||
1262 | /* make a decent zoom */ | ||
1263 | if (x - ginfo->press_x < 10) | ||
1264 | return; | ||
1265 | zoom_in_window(ginfo, ginfo->press_x, x); | ||
1266 | } else if (x < ginfo->press_x) | ||
1267 | zoom_out_window(ginfo, ginfo->press_x, x); | ||
1268 | } | ||
1175 | 1269 | ||
1176 | static gboolean | 1270 | static gboolean |
1177 | button_release_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) | 1271 | button_release_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) |
1178 | { | 1272 | { |
1179 | struct graph_info *ginfo = data; | 1273 | struct graph_info *ginfo = data; |
1180 | 1274 | ||
1181 | if (ginfo->line_active) { | 1275 | activate_zoom(ginfo, event->x); |
1182 | ginfo->line_active = FALSE; | ||
1183 | clear_last_line(widget, ginfo); | ||
1184 | ginfo->last_x = ginfo->press_x; | ||
1185 | clear_last_line(widget, ginfo); | ||
1186 | |||
1187 | if (event->x > ginfo->press_x) { | ||
1188 | /* make a decent zoom */ | ||
1189 | if (event->x - ginfo->press_x < 10) | ||
1190 | return TRUE; | ||
1191 | zoom_in_window(ginfo, ginfo->press_x, event->x); | ||
1192 | } else if (event->x < ginfo->press_x) | ||
1193 | zoom_out_window(ginfo, ginfo->press_x, event->x); | ||
1194 | } | ||
1195 | 1276 | ||
1196 | return TRUE; | 1277 | return TRUE; |
1197 | } | 1278 | } |
@@ -1203,6 +1284,7 @@ leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data) | |||
1203 | 1284 | ||
1204 | update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y, | 1285 | update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y, |
1205 | ginfo->cpu_data_w, ginfo->cpu_data_h); | 1286 | ginfo->cpu_data_w, ginfo->cpu_data_h); |
1287 | |||
1206 | return FALSE; | 1288 | return FALSE; |
1207 | } | 1289 | } |
1208 | 1290 | ||
@@ -1863,8 +1945,18 @@ create_graph_info(struct graph_info *ginfo) | |||
1863 | (GtkSignalFunc) info_expose_event, ginfo); | 1945 | (GtkSignalFunc) info_expose_event, ginfo); |
1864 | gtk_signal_connect(GTK_OBJECT(info), "configure_event", | 1946 | gtk_signal_connect(GTK_OBJECT(info), "configure_event", |
1865 | (GtkSignalFunc) info_configure_event, ginfo); | 1947 | (GtkSignalFunc) info_configure_event, ginfo); |
1866 | 1948 | gtk_signal_connect(GTK_OBJECT(info), "button_press_event", | |
1867 | gtk_widget_set_events(info, GDK_EXPOSURE_MASK); | 1949 | (GtkSignalFunc) info_button_press_event, ginfo); |
1950 | gtk_signal_connect(GTK_OBJECT(info), "motion_notify_event", | ||
1951 | (GtkSignalFunc) info_motion_notify_event, ginfo); | ||
1952 | gtk_signal_connect(GTK_OBJECT(info), "button_release_event", | ||
1953 | (GtkSignalFunc) info_button_release_event, ginfo); | ||
1954 | |||
1955 | gtk_widget_set_events(info, GDK_EXPOSURE_MASK | ||
1956 | | GDK_BUTTON_PRESS_MASK | ||
1957 | | GDK_BUTTON_RELEASE_MASK | ||
1958 | | GDK_POINTER_MOTION_MASK | ||
1959 | | GDK_POINTER_MOTION_HINT_MASK); | ||
1868 | 1960 | ||
1869 | return info; | 1961 | return info; |
1870 | } | 1962 | } |
@@ -1980,7 +2072,6 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
1980 | | GDK_POINTER_MOTION_HINT_MASK | 2072 | | GDK_POINTER_MOTION_HINT_MASK |
1981 | | GDK_LEAVE_NOTIFY_MASK); | 2073 | | GDK_LEAVE_NOTIFY_MASK); |
1982 | 2074 | ||
1983 | |||
1984 | gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ginfo->scrollwin), | 2075 | gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ginfo->scrollwin), |
1985 | ginfo->draw); | 2076 | ginfo->draw); |
1986 | gtk_widget_show(ginfo->draw); | 2077 | gtk_widget_show(ginfo->draw); |