X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fdetailedevents%2Fevents.c;h=32f8ca3f65ffa000da843d93d056f9b792835759;hb=91eedcbffa5fbf9de81c60d1798fdd76ea63fdee;hp=074a07aa110181abf8099d5df4ed921c2399b19d;hpb=aaecaa999a51da6f31979c3a98825545ce8e35c8;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c index 074a07aa..32f8ca3f 100644 --- a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c +++ b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c @@ -133,10 +133,14 @@ typedef struct _EventViewerData { LttvTracesetContextPosition *first_event; /* Time of the first event shown */ LttvTracesetContextPosition *last_event; /* Time of the first event shown */ + LttvTracesetContextPosition *current_time_get_first; + LttvFilter *main_win_filter; gint background_info_waiting; + guint32 last_tree_update_time; /* To filter out repeat keys */ + } EventViewerData ; /** hook functions for update time interval, current time ... */ @@ -175,6 +179,8 @@ static void tree_v_size_request_cb (GtkWidget *widget, static void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data); static void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data); +static gboolean key_handler(GtkWidget *widget, GdkEventKey *event, + gpointer user_data); static gint redraw_notify(void *hook_data, void *call_data); @@ -272,6 +278,8 @@ gui_events(Tab *tab) event_viewer_data->update_cursor = TRUE; event_viewer_data->report_position = TRUE; + event_viewer_data->last_tree_update_time = 0; + /* Create a model for storing the data list */ event_viewer_data->store_m = gtk_list_store_new ( N_COLUMNS, /* Total number of columns */ @@ -307,6 +315,10 @@ gui_events(Tab *tab) G_CALLBACK (tree_v_move_cursor_cb), event_viewer_data); + g_signal_connect (G_OBJECT(event_viewer_data->tree_v), "key-press-event", + G_CALLBACK(key_handler), + event_viewer_data); + // Use on each column! //gtk_tree_view_column_set_sizing(event_viewer_data->tree_v, //GTK_TREE_VIEW_COLUMN_FIXED); @@ -549,9 +561,8 @@ static void request_background_data(EventViewerData *event_viewer_data) * information. Happens when two viewers ask for it before servicing * starts. */ - lttvwindowtraces_background_request_remove(trace, "state"); - lttvwindowtraces_background_request_queue(trace, - "state"); + if(!lttvwindowtraces_background_request_find(trace, "state")) + lttvwindowtraces_background_request_queue(trace, "state"); lttvwindowtraces_background_notify_queue(event_viewer_data, trace, ltt_time_infinite, @@ -635,7 +646,20 @@ void tree_v_get_cursor(EventViewerData *event_viewer_data) #endif //0 } - +/* Filter out the key repeats that come too fast */ +static gboolean key_handler(GtkWidget *widget, GdkEventKey *event, + gpointer user_data) +{ + EventViewerData *evd = (EventViewerData *)user_data; + + g_debug("event time : %u , last time : %u", event->time, + evd->last_tree_update_time); + + if(guint32_before(event->time, evd->last_tree_update_time)) + return TRUE; + else + return FALSE; +} void tree_v_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, @@ -982,7 +1006,13 @@ static void tree_selection_changed_cb (GtkTreeSelection *selection, #endif //0 } - +#if 0 +static gint key_snooper(GtkWidget *grab_widget, GdkEventKey *event, + gpointer func_data) +{ + return TRUE; +} +#endif //0 /* This callback may be recalled after a step up/down, but we don't want to lose * the exact position : what we do is that we only set the value if it has @@ -1010,7 +1040,12 @@ void v_scroll_cb (GtkAdjustment *adjustment, gpointer data) //LttTime old_time = event_viewer_data->first_event; + + //gint snoop = gtk_key_snooper_install(key_snooper, NULL); + get_events(adjustment->value, event_viewer_data); + + //gtk_key_snooper_remove(snoop); #if 0 LttTime time = ltt_time_sub(event_viewer_data->first_event, tsc->time_span.start_time); @@ -1196,7 +1231,7 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) 0); lttv_traceset_context_position_copy(pos, first_pos); - if(relative_position > 0) { + if(relative_position >= 0) { LttTime first_event_time = lttv_traceset_context_position_get_time( pos); @@ -1206,7 +1241,7 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) G_MAXUINT, pos); - } else if(relative_position <= 0) { + } else if(relative_position < 0) { g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); } } else { @@ -1317,6 +1352,9 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) //g_signal_emit_by_name(G_OBJECT (event_viewer_data->select_c), // "changed"); + event_viewer_data->last_tree_update_time = + gdk_x11_get_server_time( + gtk_widget_get_parent_window(event_viewer_data->tree_v)); return; } @@ -1414,6 +1452,23 @@ static void event_update_selection(EventViewerData *event_viewer_data) } } +static int current_time_get_first_event_hook(void *hook_data, void *call_data) +{ + EventViewerData *event_viewer_data = (EventViewerData*)hook_data; + LttvTracefileContext *tfc = (LttvTracefileContext*)call_data; + LttEvent *e = ltt_tracefile_get_event(tfc->tf); + + LttvFilter *filter = event_viewer_data->main_win_filter; + if(filter != NULL && filter->head != NULL) + if(!lttv_filter_tree_parse(filter->head,e,tfc->tf, + tfc->t_context->t,tfc)) + return FALSE; + + lttv_traceset_context_position_save(tfc->t_context->ts_context, + event_viewer_data->current_time_get_first); + return TRUE; +} + gboolean update_current_time(void * hook_data, void * call_data) { @@ -1434,20 +1489,31 @@ gboolean update_current_time(void * hook_data, void * call_data) *current_time); lttv_process_traceset_middle(tsc, *current_time, G_MAXUINT, NULL); - /* Little trick : seek 0 events forward to get the first event - * that passes the filter. The trick is to have a match function that - * returns 2 : it makes the read stop and keep the last position */ - // We don't care : this will be taken care of by the _middle. - //guint count; - //count = lttv_process_traceset_seek_n_forward(tsc, 0, - // event_viewer_data->main_win_filter); -#if 0 - lttv_process_traceset_seek_time(tsc, *current_time); -#endif //0 + /* Get the first event that passes in the filter */ + event_viewer_data->current_time_get_first = + lttv_traceset_context_position_new(tsc); + LttvHooks *hooks = lttv_hooks_new(); + lttv_hooks_add(hooks, + current_time_get_first_event_hook, + event_viewer_data, + LTTV_PRIO_DEFAULT); + + lttv_process_traceset_begin(tsc, + NULL, NULL, NULL, hooks, NULL); + + lttv_process_traceset_middle(tsc, ltt_time_infinite, G_MAXUINT, NULL); + + lttv_process_traceset_end(tsc, + NULL, NULL, NULL, hooks, NULL); + + lttv_hooks_destroy(hooks); - lttv_traceset_context_position_save(tsc, - event_viewer_data->currently_selected_position); + lttv_traceset_context_position_copy( + event_viewer_data->currently_selected_position, + event_viewer_data->current_time_get_first); + lttv_traceset_context_position_destroy( + event_viewer_data->current_time_get_first); pos_time = lttv_traceset_context_position_get_time( event_viewer_data->currently_selected_position); }