X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fdetailedevents%2Fevents.c;h=28adb8ace6e9761bc8ee5c8d4f52a821352ee4bc;hb=703b25fad5513ff1d7dc442c0e5d278160964f44;hp=a61268790835e79dd9b5393a486037ca89b5c245;hpb=1193dd6805ea06edbd8336d6dfc01056802816ac;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 a6126879..28adb8ac 100644 --- a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c +++ b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c @@ -124,6 +124,8 @@ typedef struct _EventViewerData { gint num_visible_events; LttvTracesetContextPosition *currently_selected_position; + gboolean update_cursor; /* Speed optimisation : do not update cursor when + unnecessary */ LttvTracesetContextPosition *first_event; /* Time of the first event shown */ LttvTracesetContextPosition *last_event; /* Time of the first event shown */ @@ -256,6 +258,8 @@ gui_events(Tab *tab) event_viewer_data->main_win_filter = NULL; + event_viewer_data->update_cursor = TRUE; + /* Create a model for storing the data list */ event_viewer_data->store_m = gtk_list_store_new ( N_COLUMNS, /* Total number of columns */ @@ -553,23 +557,158 @@ void tree_v_move_cursor_cb (GtkWidget *widget, EventViewerData *event_viewer_data = (EventViewerData*)data; g_debug("move cursor cb"); - gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), - &path, NULL); - if(path == NULL) - { + //gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + // &path, NULL); + //if(path == NULL) + //{ /* No prior cursor, put it at beginning of page * and let the execution do */ + // path = gtk_tree_path_new_from_indices(0, -1); + // gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + // path, NULL, FALSE); + //} + + //indices = gtk_tree_path_get_indices(path); + + //value = gtk_adjustment_get_value(event_viewer_data->vadjust_c); + + /* If no prior position... */ + if(ltt_time_compare( + lttv_traceset_context_position_get_time( + event_viewer_data->currently_selected_position), + ltt_time_infinite) == 0) { + path = gtk_tree_path_new_from_indices(0, -1); gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE); + + gtk_tree_path_free(path); + return; + } - indices = gtk_tree_path_get_indices(path); - - value = gtk_adjustment_get_value(event_viewer_data->vadjust_c); g_debug("tree view move cursor : arg1 is %u and arg2 is %d", (guint)arg1, arg2); + + switch(arg1) { + case GTK_MOVEMENT_DISPLAY_LINES: + if(arg2 == 1) { + /* Move one line down */ + if(event_viewer_data->pos->len > 0) { + LttvTracesetContextPosition *end_pos = + (LttvTracesetContextPosition*)g_ptr_array_index( + event_viewer_data->pos, + event_viewer_data->pos->len - 1); + if(lttv_traceset_context_pos_pos_compare(end_pos, + event_viewer_data->currently_selected_position) == 0) { + /* Must get down one event and select the last one */ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection( + GTK_TREE_VIEW(event_viewer_data->tree_v))); + event_viewer_data->update_cursor = FALSE; + gtk_adjustment_set_value(event_viewer_data->vadjust_c, + gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 1); + event_viewer_data->update_cursor = TRUE; + path = gtk_tree_path_new_from_indices( + event_viewer_data->pos->len - 1, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); + } +#if 0 + GtkTreePath *path = gtk_tree_path_new_from_indices(i, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); +#endif //0 + } + + } else { + if(event_viewer_data->pos->len > 0) { + /* Move one line up */ + LttvTracesetContextPosition *begin_pos = + (LttvTracesetContextPosition*)g_ptr_array_index( + event_viewer_data->pos, + 0); + if(lttv_traceset_context_pos_pos_compare(begin_pos, + event_viewer_data->currently_selected_position) == 0) { + /* Must get up one event and select the first one */ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection( + GTK_TREE_VIEW(event_viewer_data->tree_v))); + event_viewer_data->update_cursor = FALSE; + gtk_adjustment_set_value(event_viewer_data->vadjust_c, + gtk_adjustment_get_value(event_viewer_data->vadjust_c) - 1); + event_viewer_data->update_cursor = TRUE; + path = gtk_tree_path_new_from_indices( + 0, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); + } + } + } + break; + case GTK_MOVEMENT_PAGES: + if(arg2 == 1) { + /* Move one page down */ + if(event_viewer_data->pos->len > 0) { + LttvTracesetContextPosition *end_pos = + (LttvTracesetContextPosition*)g_ptr_array_index( + event_viewer_data->pos, + event_viewer_data->pos->len - 1); + if(lttv_traceset_context_pos_pos_compare(end_pos, + event_viewer_data->currently_selected_position) == 0) { + /* Must get down one page and select the last one */ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection( + GTK_TREE_VIEW(event_viewer_data->tree_v))); + + event_viewer_data->update_cursor = FALSE; + gtk_adjustment_set_value(event_viewer_data->vadjust_c, + gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 2); + event_viewer_data->update_cursor = TRUE; + + path = gtk_tree_path_new_from_indices( + event_viewer_data->pos->len - 1, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); + + } + } + + } else { + /* Move one page up */ + if(event_viewer_data->pos->len > 0) { + LttvTracesetContextPosition *begin_pos = + (LttvTracesetContextPosition*)g_ptr_array_index( + event_viewer_data->pos, + 0); + if(lttv_traceset_context_pos_pos_compare(begin_pos, + event_viewer_data->currently_selected_position) == 0) { + /* Must get up one page and select the first one */ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection( + GTK_TREE_VIEW(event_viewer_data->tree_v))); + + event_viewer_data->update_cursor = FALSE; + gtk_adjustment_set_value(event_viewer_data->vadjust_c, + gtk_adjustment_get_value(event_viewer_data->vadjust_c) - 2); + event_viewer_data->update_cursor = TRUE; + + path = gtk_tree_path_new_from_indices( + 0, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); + } + } + + } + break; + default: + break; + } + + //gtk_tree_path_free(path); #if 0 if(arg1 == GTK_MOVEMENT_DISPLAY_LINES) @@ -688,7 +827,6 @@ void tree_v_move_cursor_cb (GtkWidget *widget, } } #endif //0 - gtk_tree_path_free(path); } void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data) @@ -702,7 +840,6 @@ void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data) g_debug("cursor changed cb"); -#if 0 /* On cursor change, modify the currently selected event by calling * the right API function */ tree_v_get_cursor(event_viewer_data); @@ -716,7 +853,6 @@ void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data) }else{ g_warning("Can not get iter\n"); } -#endif //0 } @@ -1045,12 +1181,10 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) /* Mathieu : - * I make the choice not to use the mainwindow lttvwindow API here : it will - * be faster to read the events ourself from lttv_process_traceset_middle, as - * we are already at the right read position. It would be costier to use the - * seek time closest for nothing, as we only have few events to read. + * I make the choice not to use the mainwindow lttvwindow API here : the idle + * loop might have a too low priority, and we want good update while + * scrolling. */ - /* FIXME : use seek time closest and middle to have a good state. */ lttv_process_traceset_begin(tsc, NULL, NULL, NULL, event_viewer_data->event_hooks, NULL); @@ -1135,16 +1269,18 @@ int event_hook(void *hook_data, void *call_data) g_string_free(desc, TRUE); - if(lttv_traceset_context_pos_pos_compare(pos, - event_viewer_data->currently_selected_position) == 0) { - GtkTreePath *path = gtk_tree_path_new_from_indices( - event_viewer_data->pos->len - 1, -1); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), - path, NULL, FALSE); - gtk_tree_path_free(path); + if(event_viewer_data->update_cursor) { + if(lttv_traceset_context_pos_pos_compare(pos, + event_viewer_data->currently_selected_position) == 0) { + GtkTreePath *path = gtk_tree_path_new_from_indices( + event_viewer_data->pos->len - 1, -1); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), + path, NULL, FALSE); + gtk_tree_path_free(path); + } } - - if(event_viewer_data->pos->len >= event_viewer_data->num_visible_events) + + if(event_viewer_data->pos->len >= event_viewer_data->num_visible_events -1 ) return TRUE; else return FALSE;