X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fdetailedevents%2Fevents.c;h=84af45a060e2b0ee98d7da31b7faf2abd73f1680;hb=5698740e7329b8a34faf0c178ff44a5e21654cdc;hp=b5af37d0ab24dfb7c37fa11b20321a4df620901a;hpb=ba2d4f484971795c436398112728832f93185243;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 b5af37d0..84af45a0 100644 --- a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c +++ b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,7 @@ #include #include #include +#include #include "hGuiEventsInsert.xpm" @@ -76,6 +78,9 @@ #define abs(a) (((a)<0)?(-a):(a)) #define max(a,b) ((a)>(b)?(a):(b)) +/* Number of events between checks for GDK events (stop button) */ +#define CHECK_GDK_INTERVAL 50000 + /** Array containing instanced objects. Used when module is unloaded */ static GSList *g_event_viewer_data_list = NULL ; @@ -91,6 +96,7 @@ typedef enum _ScrollDirection{ typedef struct _EventViewerData { Tab * tab; + LttvPluginTab *ptab; LttvHooks * event_hooks; /* previous value is used to determine if it is a page up/down or @@ -141,6 +147,8 @@ typedef struct _EventViewerData { guint32 last_tree_update_time; /* To filter out repeat keys */ + guint num_events; /* Number of events processed */ + } EventViewerData ; /** hook functions for update time interval, current time ... */ @@ -153,9 +161,9 @@ gboolean filter_changed(void * hook_data, void * call_data); static void request_background_data(EventViewerData *event_viewer_data); //! Event Viewer's constructor hook -GtkWidget *h_gui_events(Tab *tab); +GtkWidget *h_gui_events(LttvPlugin *plugin); //! Event Viewer's constructor -EventViewerData *gui_events(Tab *tab); +EventViewerData *gui_events(LttvPluginTab *ptab); //! Event Viewer's destructor void gui_events_destructor(EventViewerData *event_viewer_data); void gui_events_free(EventViewerData *event_viewer_data); @@ -214,9 +222,10 @@ enum * @return The widget created. */ GtkWidget * -h_gui_events(Tab * tab) +h_gui_events(LttvPlugin *plugin) { - EventViewerData* event_viewer_data = gui_events(tab) ; + LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin); + EventViewerData* event_viewer_data = gui_events(ptab) ; if(event_viewer_data) return event_viewer_data->top_widget; else return NULL; @@ -230,14 +239,15 @@ h_gui_events(Tab * tab) * @return The Event viewer data created. */ EventViewerData * -gui_events(Tab *tab) +gui_events(LttvPluginTab *ptab) { LttTime end; GtkTreeViewColumn *column; GtkCellRenderer *renderer; EventViewerData* event_viewer_data = g_new(EventViewerData,1) ; - + Tab *tab = ptab->tab; event_viewer_data->tab = tab; + event_viewer_data->ptab = ptab; LttvTracesetContext * tsc = lttvwindow_get_traceset_context(event_viewer_data->tab); @@ -1040,6 +1050,8 @@ gboolean tree_v_scroll_handler (GtkWidget *widget, GdkEventScroll *event, gpoint gtk_adjustment_set_value(event_viewer_data->vadjust_c, gtk_adjustment_get_value(event_viewer_data->vadjust_c) + 1); break; + default: + g_error("Only scroll up and down expected"); } return TRUE; } @@ -1181,14 +1193,13 @@ static __inline gint get_cell_height(GtkTreeView *TreeView) gtk_tree_view_column_cell_get_size(column, NULL, NULL, NULL, NULL, &height); -#if GTK_CHECK_VERSION(2.4.15) gint vertical_separator; gtk_widget_style_get (GTK_WIDGET (TreeView), "vertical-separator", &vertical_separator, NULL); height += vertical_separator; -#endif + return height; } @@ -1280,6 +1291,9 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) double value = new_value - event_viewer_data->previous_value; + /* Set stop button status for foreground processing */ + event_viewer_data->tab->stop_foreground = FALSE; + /* See where we have to scroll... */ ScrollDirection direction; gint relative_position; @@ -1441,11 +1455,14 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) /* Mathieu : * 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. + * scrolling. However, we call the gdk loop to get events periodically so the + * processing can be stopped. */ lttv_process_traceset_begin(tsc, NULL, NULL, NULL, event_viewer_data->event_hooks, NULL); + + event_viewer_data->num_events = 0; lttv_process_traceset_middle(tsc, ltt_time_infinite, G_MAXUINT, NULL); @@ -1484,6 +1501,14 @@ int event_hook(void *hook_data, void *call_data) LttvTracefileState *tfs = (LttvTracefileState*)call_data; LttEvent *e = ltt_tracefile_get_event(tfc->tf); + event_viewer_data->num_events++; + if(event_viewer_data->num_events % CHECK_GDK_INTERVAL == 0) { + while(gtk_events_pending ()) + gtk_main_iteration(); + if(event_viewer_data->tab->stop_foreground) + return TRUE; + } + LttvFilter *filter = event_viewer_data->main_win_filter; if(filter != NULL && filter->head != NULL) if(!lttv_filter_tree_parse(filter->head,e,tfc->tf, @@ -1754,6 +1779,7 @@ gint redraw_notify(void *hook_data, void *call_data) EventViewerData *event_viewer_data = (EventViewerData*) hook_data; get_events(event_viewer_data->vadjust_c->value, event_viewer_data); + return 0; } void gui_events_free(EventViewerData *event_viewer_data)