X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Flttvwindow%2Flttvwindow%2Flttvwindow.c;h=225104c780a5f7b27b12c9f9f8e090c800e99253;hb=c7891f0b5f4b99436dcd1d64c2968ffe1a0b91ef;hp=a0971163bcaa0c772e322b30226ca8e505643c83;hpb=db8bc91756aba1610e896aa1e9eee184843f3970;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c index a0971163..225104c7 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c @@ -28,6 +28,10 @@ * */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -97,6 +101,27 @@ void set_current_time(Tab *tab, const LttTime *current_time) if(tmp != NULL) lttv_hooks_call(tmp, &tab->current_time); } +/* set_current_position + * + * It updates the current time of the tab, then calls the updatetimewindow + * hooks of each viewer. + * + * This is called whenever the current time value changes. + */ + +void set_current_position(Tab *tab, const LttvTracesetContextPosition *pos) +{ + LttvAttributeValue value; + LttvHooks * tmp; + + tab->current_time = lttv_traceset_context_position_get_time(pos); + + g_assert(lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatecurrentposition", LTTV_POINTER, &value)); + tmp = (LttvHooks*)*(value.v_pointer); + if(tmp != NULL) lttv_hooks_call(tmp, pos); +} + void add_toolbar_constructor(MainWindow *mw, LttvToolbarClosure *toolbar_c) { LttvIAttribute *attributes = mw->attributes; @@ -228,6 +253,7 @@ void remove_menu_constructor(MainWindow *mw, lttvwindow_viewer_constructor viewe * * It should be called by init function of the module. * + * @param name name of the viewer * @param menu_path path of the menu item. * @param menu_text text of the menu item. * @param pixmap Image shown on the toolbar item. @@ -236,7 +262,8 @@ void remove_menu_constructor(MainWindow *mw, lttvwindow_viewer_constructor viewe */ void lttvwindow_register_constructor - (char * menu_path, + (char * name, + char * menu_path, char * menu_text, char ** pixmap, char * tooltip, @@ -249,6 +276,8 @@ void lttvwindow_register_constructor LttvMenuClosure menu_c; LttvAttributeValue value; + if(view_constructor == NULL) return; + if(pixmap != NULL) { g_assert(lttv_iattribute_find_by_path(attributes_global, "viewers/toolbar", LTTV_POINTER, &value)); @@ -281,6 +310,19 @@ void lttvwindow_register_constructor (gpointer)add_menu_constructor, &menu_c); } + { + LttvAttribute *attribute; + g_assert(attribute = + LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(attributes_global), + LTTV_VIEWER_CONSTRUCTORS))); + + g_assert(lttv_iattribute_find_by_path(LTTV_IATTRIBUTE(attribute), + name, LTTV_POINTER, &value)); + + *(value.v_pointer) = view_constructor; + + } } @@ -324,6 +366,29 @@ void lttvwindow_unregister_constructor view_constructor); lttv_menus_remove(menu, view_constructor); } + + { + LttvAttribute *attribute; + g_assert(attribute = + LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(attributes_global), + LTTV_VIEWER_CONSTRUCTORS))); + + guint num = lttv_iattribute_get_number(LTTV_IATTRIBUTE(attribute)); + guint i; + LttvAttributeName name; + LttvAttributeValue value; + LttvAttributeType type; + + for(i=0;iattributes, + "hooks/updatecurrentposition", LTTV_POINTER, &value)); + tmp = (LttvHooks*)*(value.v_pointer); + if(tmp == NULL){ + tmp = lttv_hooks_new(); + *(value.v_pointer) = tmp; + } + lttv_hooks_add(tmp, hook, hook_data, LTTV_PRIO_DEFAULT); +} + + +/** + * function to unregister a viewer's hook function which is used to + * set/update the current position of the viewer. + * @param tab viewer's tab + * @param hook hook function of the viewer. + * @param hook_data hook data associated with the hook function. + */ + +void lttvwindow_unregister_current_position_notify(Tab *tab, + LttvHook hook, gpointer hook_data) +{ + LttvAttributeValue value; + LttvHooks * tmp; + g_assert(lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatecurrentposition", LTTV_POINTER, &value)); + tmp = (LttvHooks*)*(value.v_pointer); + if(tmp == NULL) return; + lttv_hooks_remove_data(tmp, hook, hook_data); +} + /** * Function to register a hook function for a viewer to show @@ -719,24 +828,24 @@ void lttvwindow_report_time_window(Tab *tab, "upper", ltt_time_to_double( ltt_time_sub(time_span.end_time, time_span.start_time)) - * NANOSECONDS_PER_SECOND, /* upper */ + , /* upper */ "step_increment", ltt_time_to_double(time_window->time_width) / SCROLL_STEP_PER_PAGE - * NANOSECONDS_PER_SECOND, /* step increment */ + , /* step increment */ "page_increment", ltt_time_to_double(time_window->time_width) - * NANOSECONDS_PER_SECOND, /* page increment */ + , /* page increment */ "page_size", ltt_time_to_double(time_window->time_width) - * NANOSECONDS_PER_SECOND, /* page size */ + , /* page size */ NULL); gtk_adjustment_changed(adjustment); //g_object_set(G_OBJECT(adjustment), // "value", // ltt_time_to_double(time_window->start_time) - // * NANOSECONDS_PER_SECOND, /* value */ + // , /* value */ // NULL); /* Note : the set value will call set_time_window if scrollbar value changed */ @@ -744,13 +853,13 @@ void lttvwindow_report_time_window(Tab *tab, ltt_time_to_double( ltt_time_sub(time_window->start_time, time_span.start_time)) - * NANOSECONDS_PER_SECOND); + ); #endif //0 } /** - * Function to set the current time/event of the current tab. + * Function to set the current time of the current tab. * It will be called by a viewer's signal handle associated with * the button-release-event signal * @param tab viewer's tab @@ -766,6 +875,24 @@ void lttvwindow_report_current_time(Tab *tab, current_time_change_manager(tab, time); } +/** + * Function to set the current event of the current tab. + * It will be called by a viewer's signal handle associated with + * the button-release-event signal + * @param tab viewer's tab + * @param time a pointer where time is stored. + */ + +void lttvwindow_report_current_position(Tab *tab, + LttvTracesetContextPosition *pos) +{ + LttvAttributeValue value; + LttvHooks * tmp; + + current_position_change_manager(tab, pos); +} + + /** * Function to set the position of the hpane's dividor (viewer). * It will be called by a viewer's signal handle associated with @@ -785,23 +912,6 @@ void lttvwindow_report_dividor(Tab *tab, gint position) lttv_hooks_call(tmp, &position); } -/** - * Function to set the focused pane (viewer). - * It will be called by a viewer's signal handle associated with - * the grab_focus signal - * @param tab viewer's tab - * @param top_widget the top widget containing all the other widgets of the - * viewer. - */ - -void lttvwindow_report_focus(Tab *tab, GtkWidget *top_widget) -{ - //FIXME - //gtk_multi_vpaned_set_focus(tab->multivpaned, - // GTK_PANED(gtk_widget_get_parent(top_widget))); -} - - /** * Function to request data in a specific time interval to the main window. The * event request servicing is differed until the glib idle functions are @@ -857,10 +967,10 @@ gint find_viewer (const EventsRequest *a, gconstpointer b) void lttvwindow_events_request_remove_all(Tab *tab, gconstpointer viewer) { - GSList *element; + GSList *element = tab->events_requests; while((element = - g_slist_find_custom(tab->events_requests, viewer, + g_slist_find_custom(element, viewer, (GCompareFunc)find_viewer)) != NULL) { EventsRequest *events_request = (EventsRequest *)element->data; @@ -870,8 +980,11 @@ void lttvwindow_events_request_remove_all(Tab *tab, //if(events_request->servicing == TRUE) { // lttv_hooks_call(events_request->after_request, NULL); //} - g_free(events_request); + events_request_free(events_request); + //g_free(events_request); tab->events_requests = g_slist_remove_link(tab->events_requests, element); + element = g_slist_next(element); + if(element == NULL) break; /* end of list */ } if(g_slist_length(tab->events_requests) == 0) { tab->events_request_pending = FALSE; @@ -880,8 +993,6 @@ void lttvwindow_events_request_remove_all(Tab *tab, } - - /** * Function to get the current time interval shown on the current tab. * It will be called by a viewer's hook function to update the @@ -894,7 +1005,6 @@ void lttvwindow_events_request_remove_all(Tab *tab, TimeWindow lttvwindow_get_time_window(Tab *tab) { return tab->time_window; - } @@ -914,18 +1024,46 @@ LttTime lttvwindow_get_current_time(Tab *tab) /** * Function to get the filter of the current tab. - * It will be called by the constructor of the viewer and also be - * called by a hook funtion of the viewer to update its filter. - * @param tab viewer's tab + * @param main_win, the main window the viewer belongs to. * @param filter, a pointer to a filter. */ -const lttv_filter *lttvwindow_get_filter(Tab *tab) +#if 0 +LttvFilter *lttvwindow_get_filter(Tab *tab) { - //FIXME - g_warning("lttvwindow_get_filter not implemented in viewer.c"); + return tab->filter; +} +#endif //0 + +/** + * Function to set the filter of the current tab. + * It should be called by the filter GUI to tell the + * main window to update the filter tab's lttv_filter. + * + * This function does change the current filter, removing the + * old one when necessary, and call the updatefilter hooks + * of the registered viewers. + * + * @param main_win, the main window the viewer belongs to. + * @param filter, a pointer to a filter. + */ + +void lttvwindow_report_filter(Tab *tab, LttvFilter *filter) +{ + LttvAttributeValue value; + LttvHooks * tmp; + + lttv_filter_destroy(tab->filter); + tab->filter = filter; + + g_assert(lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatefilter", LTTV_POINTER, &value)); + tmp = (LttvHooks*)*(value.v_pointer); + if(tmp == NULL) return; + lttv_hooks_call(tmp, filter); } + /** * Function to get the stats of the traceset * @param tab viewer's tab @@ -941,3 +1079,62 @@ LttvTracesetContext* lttvwindow_get_traceset_context(Tab *tab) { return (LttvTracesetContext*)tab->traceset_info->traceset_context; } + + +void events_request_free(EventsRequest *events_request) +{ + if(events_request == NULL) return; + + if(events_request->start_position != NULL) + lttv_traceset_context_position_destroy(events_request->start_position); + if(events_request->end_position != NULL) + lttv_traceset_context_position_destroy(events_request->end_position); + if(events_request->hooks != NULL) { + guint i; + GArray *hooks = events_request->hooks; + for(i=0;ilen;i++) { + lttv_trace_hook_destroy(&g_array_index(hooks, LttvTraceHook, i)); + } + g_array_free(events_request->hooks, TRUE); + } + if(events_request->before_chunk_traceset != NULL) + lttv_hooks_destroy(events_request->before_chunk_traceset); + if(events_request->before_chunk_trace != NULL) + lttv_hooks_destroy(events_request->before_chunk_trace); + if(events_request->before_chunk_tracefile != NULL) + lttv_hooks_destroy(events_request->before_chunk_tracefile); + if(events_request->event != NULL) + lttv_hooks_destroy(events_request->event); + if(events_request->event_by_id != NULL) + lttv_hooks_by_id_destroy(events_request->event_by_id); + if(events_request->after_chunk_tracefile != NULL) + lttv_hooks_destroy(events_request->after_chunk_tracefile); + if(events_request->after_chunk_trace != NULL) + lttv_hooks_destroy(events_request->after_chunk_trace); + if(events_request->after_chunk_traceset != NULL) + lttv_hooks_destroy(events_request->after_chunk_traceset); + if(events_request->before_request != NULL) + lttv_hooks_destroy(events_request->before_request); + if(events_request->after_request != NULL) + lttv_hooks_destroy(events_request->after_request); + + g_free(events_request); +} + + +void main_window_add_child_window(Tab *tab, gpointer data, + const gchar *name, GDestroyNotify destroy_fct) +{ + g_object_set_data_full(G_OBJECT(tab->mw->mwindow), + name, + data, + destroy_fct); +} + +void main_window_remove_child_window(Tab *tab, + const gchar *name) +{ + /* Might return NULL if called from the descructor upon main window close */ + g_object_steal_data(G_OBJECT(tab->mw->mwindow), name); +} +