X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Flttvwindow%2Flttvwindow%2Flttvwindow.c;h=4f77d883a695173b97fc73db4e5bd834bac5bddc;hb=08fb203b469865535d163e6444d3cfa6ad61ac62;hp=d2009771d83fdbc5dd98e97d63eb70b17468e00c;hpb=6ea089620900a1e1353112b14ccb3b6df05a9883;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 d2009771..4f77d883 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 @@ -41,110 +45,83 @@ #include // for execute_events_requests #include - /** * Internal function parts */ extern GSList * g_main_window_list; -/** - * Function to set/update traceset for the viewers - * @param tab viewer's tab - * @param traceset traceset of the main window. - * return value : - * -1 : error - * 0 : traceset updated - * 1 : no traceset hooks to update; not an error. - */ - -int SetTraceset(Tab * tab, LttvTraceset *traceset) -{ - LttvHooks * tmp; - LttvAttributeValue value; - - if( lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatetraceset", LTTV_POINTER, &value) != 0) - return -1; - - tmp = (LttvHooks*)*(value.v_pointer); - if(tmp == NULL) return 1; - - - lttv_hooks_call(tmp,traceset); - - return 0; -} - +__EXPORT gint lttvwindow_preempt_count = 0; -/** - * Function to set/update filter for the viewers - * @param tab viewer's tab - * @param filter filter of the main window. - * return value : - * -1 : error - * 0 : filters updated - * 1 : no filter hooks to update; not an error. +/* set_time_window + * + * It updates the time window of the tab, then calls the updatetimewindow + * hooks of each viewer. + * + * This is called whenever the scrollbar value changes. */ -int SetFilter(Tab * tab, gpointer filter) +void set_time_window(Tab *tab, const TimeWindow *time_window) { - LttvHooks * tmp; LttvAttributeValue value; + LttvHooks * tmp; - if(lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatefilter", LTTV_POINTER, &value) != 0) - return -1; + TimeWindowNotifyData time_window_notify_data; + TimeWindow old_time_window = tab->time_window; + time_window_notify_data.old_time_window = &old_time_window; + tab->time_window = *time_window; + time_window_notify_data.new_time_window = + &(tab->time_window); + g_assert(lttv_iattribute_find_by_path(tab->attributes, + "hooks/updatetimewindow", LTTV_POINTER, &value)); tmp = (LttvHooks*)*(value.v_pointer); + if(tmp != NULL) lttv_hooks_call(tmp, &time_window_notify_data); - if(tmp == NULL) return 1; - lttv_hooks_call(tmp,filter); + //gtk_multi_vpaned_set_adjust(tab->multi_vpaned, new_time_window, FALSE); - return 0; } -/** - * Function to redraw each viewer belonging to the current tab - * @param tab viewer's tab +/* set_current_time + * + * 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 update_traceset(Tab *tab) +void set_current_time(Tab *tab, const LttTime *current_time) { LttvAttributeValue value; LttvHooks * tmp; + + tab->current_time = *current_time; + g_assert(lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatetraceset", LTTV_POINTER, &value)); + "hooks/updatecurrenttime", LTTV_POINTER, &value)); tmp = (LttvHooks*)*(value.v_pointer); - if(tmp == NULL) return; - lttv_hooks_call(tmp, NULL); -} - -void set_time_window_adjustment(Tab *tab, const TimeWindow* new_time_window) -{ - gtk_multi_vpaned_set_adjust(tab->multi_vpaned, new_time_window, FALSE); + 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_time_window(Tab *tab, const TimeWindow *time_window) +void set_current_position(Tab *tab, const LttvTracesetContextPosition *pos) { LttvAttributeValue value; LttvHooks * tmp; - TimeWindowNotifyData time_window_notify_data; - TimeWindow old_time_window = tab->time_window; - time_window_notify_data.old_time_window = &old_time_window; - tab->time_window = *time_window; - time_window_notify_data.new_time_window = - &(tab->time_window); + tab->current_time = lttv_traceset_context_position_get_time(pos); g_assert(lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatetimewindow", LTTV_POINTER, &value)); + "hooks/updatecurrentposition", LTTV_POINTER, &value)); tmp = (LttvHooks*)*(value.v_pointer); - if(tmp == NULL) return; - lttv_hooks_call(tmp, &time_window_notify_data); - - + if(tmp != NULL) lttv_hooks_call(tmp, pos); } void add_toolbar_constructor(MainWindow *mw, LttvToolbarClosure *toolbar_c) @@ -228,7 +205,6 @@ void remove_toolbar_constructor(MainWindow *mw, lttvwindow_viewer_constructor vi LttvIAttribute *attributes = mw->attributes; LttvAttributeValue value; LttvToolbars * instance_toolbar; - lttvwindow_viewer_constructor constructor; GtkWidget * tool_menu_title_menu, *widget; g_assert(lttv_iattribute_find_by_path(attributes, @@ -249,9 +225,7 @@ void remove_menu_constructor(MainWindow *mw, lttvwindow_viewer_constructor viewe LttvIAttribute *attributes = mw->attributes; LttvAttributeValue value; LttvMenus * instance_menu; - lttvwindow_viewer_constructor constructor; GtkWidget * tool_menu_title_menu, *widget; - LttvMenuClosure *menu_item_i; g_assert(lttv_iattribute_find_by_path(attributes, "viewers/menu", LTTV_POINTER, &value)); @@ -278,6 +252,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. @@ -285,8 +260,9 @@ void remove_menu_constructor(MainWindow *mw, lttvwindow_viewer_constructor viewe * @param view_constructor constructor of the viewer. */ -void lttvwindow_register_constructor - (char * menu_path, +__EXPORT void lttvwindow_register_constructor + (char * name, + char * menu_path, char * menu_text, char ** pixmap, char * tooltip, @@ -299,6 +275,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)); @@ -331,6 +309,22 @@ void lttvwindow_register_constructor (gpointer)add_menu_constructor, &menu_c); } + { + LttvAttribute *attribute; + gboolean result; + + attribute = LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(attributes_global), + LTTV_VIEWER_CONSTRUCTORS)); + g_assert(attribute); + + result = lttv_iattribute_find_by_path(LTTV_IATTRIBUTE(attribute), + name, LTTV_POINTER, &value); + g_assert(result); + + *(value.v_pointer) = view_constructor; + + } } @@ -345,13 +339,14 @@ void lttvwindow_register_constructor */ -void lttvwindow_unregister_constructor +__EXPORT void lttvwindow_unregister_constructor (lttvwindow_viewer_constructor view_constructor) { LttvIAttribute *attributes_global = LTTV_IATTRIBUTE(lttv_global_attributes()); LttvToolbars * toolbar; LttvMenus * menu; LttvAttributeValue value; + gboolean is_named; g_assert(lttv_iattribute_find_by_path(attributes_global, "viewers/toolbar", LTTV_POINTER, &value)); @@ -374,6 +369,30 @@ void lttvwindow_unregister_constructor view_constructor); lttv_menus_remove(menu, view_constructor); } + + { + LttvAttribute *attribute; + attribute = LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(attributes_global), + LTTV_VIEWER_CONSTRUCTORS)); + g_assert(attribute); + + 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. + */ + +__EXPORT 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 @@ -741,56 +804,93 @@ void lttvwindow_unregister_dividor(Tab *tab, /** - * Update the status bar whenever something changed in the viewer. + * Function to set the time interval of the current tab. + * It will be called by a viewer's signal handle associated with + * the move_slider signal * @param tab viewer's tab - * @param info the message which will be shown in the status bar. + * @param time_interval a pointer where time interval is stored. */ -void lttvwindow_report_status(Tab *tab, const char *info) -{ - //FIXME - g_warning("update_status not implemented in viewer.c"); - // Use tab->mw for status +__EXPORT void lttvwindow_report_time_window(Tab *tab, + TimeWindow time_window) +{ + //set_time_window(tab, time_window); + //set_time_window_adjustment(tab, time_window); + + time_change_manager(tab, time_window); + + +#if 0 + /* Set scrollbar */ + LttvTracesetContext *tsc = + LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); + TimeInterval time_span = tsc->time_span; + GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar)); + g_object_set(G_OBJECT(adjustment), + "lower", + 0.0, /* lower */ + "upper", + ltt_time_to_double( + ltt_time_sub(time_span.end_time, time_span.start_time)) + , /* upper */ + "step_increment", + ltt_time_to_double(time_window->time_width) + / SCROLL_STEP_PER_PAGE + , /* step increment */ + "page_increment", + ltt_time_to_double(time_window->time_width) + , /* page increment */ + "page_size", + ltt_time_to_double(time_window->time_width) + , /* page size */ + NULL); + gtk_adjustment_changed(adjustment); + + //g_object_set(G_OBJECT(adjustment), + // "value", + // ltt_time_to_double(time_window->start_time) + // , /* value */ + // NULL); + /* Note : the set value will call set_time_window if scrollbar value changed + */ + gtk_adjustment_set_value(adjustment, + ltt_time_to_double( + ltt_time_sub(time_window->start_time, + time_span.start_time)) + ); +#endif //0 } + /** - * Function to set the time interval 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 move_slider signal + * the button-release-event signal * @param tab viewer's tab - * @param time_interval a pointer where time interval is stored. + * @param time a pointer where time is stored. */ -void lttvwindow_report_time_window(Tab *tab, - const TimeWindow *time_window) +__EXPORT void lttvwindow_report_current_time(Tab *tab, + LttTime time) { - set_time_window(tab, time_window); - set_time_window_adjustment(tab, time_window); + current_time_change_manager(tab, time); } - /** - * Function to set the current time/event of the current tab. + * 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_time(Tab *tab, - const LttTime *time) +__EXPORT void lttvwindow_report_current_position(Tab *tab, + LttvTracesetContextPosition *pos) { - LttvAttributeValue value; - LttvHooks * tmp; - tab->current_time = *time; - g_assert(lttv_iattribute_find_by_path(tab->attributes, - "hooks/updatecurrenttime", LTTV_POINTER, &value)); - tmp = (LttvHooks*)*(value.v_pointer); - - if(tmp == NULL)return; - lttv_hooks_call(tmp, &tab->current_time); + 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 @@ -810,22 +910,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) -{ - gtk_multi_vpaned_set_focus((GtkWidget*)tab->multi_vpaned, - 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 @@ -844,15 +928,18 @@ void lttvwindow_report_focus(Tab *tab, GtkWidget *top_widget) * @param events_requested the structure of request from. */ -void lttvwindow_events_request(Tab *tab, - EventsRequest *events_request) +__EXPORT void lttvwindow_events_request(Tab *tab, + EventsRequest *events_request) { tab->events_requests = g_slist_append(tab->events_requests, events_request); if(!tab->events_request_pending) { - /* Redraw has +20 priority. We want a prio higher than that, so +19 */ - g_idle_add_full((G_PRIORITY_HIGH_IDLE + 19), + /* Redraw has +20 priority. We want to let the redraw be done while we do + * our job. Mathieu : test with high prio higher than events for better + * scrolling. */ + //g_idle_add_full((G_PRIORITY_HIGH_IDLE + 21), + g_idle_add_full((G_PRIORITY_DEFAULT + 2), (GSourceFunc)execute_events_requests, tab, NULL); @@ -877,26 +964,55 @@ gint find_viewer (const EventsRequest *a, gconstpointer b) } -void lttvwindow_events_request_remove_all(Tab *tab, +__EXPORT 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; - if(events_request->servicing == TRUE) { - lttv_hooks_call(events_request->after_request, NULL); - } - g_free(events_request); + // Modified so a viewer being destroyed won't have its after_request + // called. Not so important anyway. Note that a viewer that call this + // remove_all function will not get its after_request called. + //if(events_request->servicing == TRUE) { + // lttv_hooks_call(events_request->after_request, NULL); + //} + 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; + g_idle_remove_by_data(tab); } + } +/** + * Function to see if there are events request pending. + * + * It tells if events requests are pending. Useful for checks in some events, + * i.e. detailed event list scrolling. + * + * @param tab the tab the viewer belongs to. + * @param viewer a pointer to the viewer data structure + * @return : TRUE is events requests are pending, else FALSE. + */ + +__EXPORT gboolean lttvwindow_events_request_pending(Tab *tab) +{ + GSList *element = tab->events_requests; + + if(element == NULL) return FALSE; + else return TRUE; +} + /** * Function to get the current time interval shown on the current tab. @@ -907,10 +1023,9 @@ void lttvwindow_events_request_remove_all(Tab *tab, * @return time window. */ -TimeWindow lttvwindow_get_time_window(Tab *tab) +__EXPORT TimeWindow lttvwindow_get_time_window(Tab *tab) { return tab->time_window; - } @@ -922,7 +1037,7 @@ TimeWindow lttvwindow_get_time_window(Tab *tab) * @return time */ -LttTime lttvwindow_get_current_time(Tab *tab) +__EXPORT LttTime lttvwindow_get_current_time(Tab *tab) { return tab->current_time; } @@ -930,30 +1045,102 @@ 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 filter, a pointer to a filter. + * + * returns the current filter */ -const lttv_filter *lttvwindow_get_filter(Tab *tab) +__EXPORT LttvFilter *lttvwindow_get_filter(Tab *tab) { - //FIXME - g_warning("lttvwindow_get_filter not implemented in viewer.c"); + return g_object_get_data(G_OBJECT(tab->vbox), "filter"); } +/** + * 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 */ -LttvTracesetStats* lttvwindow_get_traceset_stats(Tab *tab) +__EXPORT LttvTracesetStats* lttvwindow_get_traceset_stats(Tab *tab) { return tab->traceset_info->traceset_context; } - -LttvTracesetContext* lttvwindow_get_traceset_context(Tab *tab) +__EXPORT 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; + lttv_trace_hook_remove_all(hooks); + 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); +} + + + +__EXPORT GtkWidget *main_window_get_widget(Tab *tab) +{ + return tab->mw->mwindow; +} +