From: compudj Date: Thu, 27 May 2004 14:32:21 +0000 (+0000) Subject: changed following Michel's email X-Git-Tag: v0.12.20~2924 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=84d9b2a1b1c8825177173111a1e8aaa243fa251a;p=lttv.git changed following Michel's email git-svn-id: http://ltt.polymtl.ca/svn@565 04897980-b3bd-0310-b5e0-8ef037075253 --- diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.c index 2adc00b8..0300cdda 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.c @@ -144,6 +144,99 @@ void set_time_window(MainWindow * main_win, const TimeWindow *time_window) } + +/* Remove menu entry and tool button from main window for the + * unloaded module + */ + +void remove_menu_item(gpointer main_win, gpointer user_data) +{ + MainWindow * mw = (MainWindow *) main_win; + lttv_menu_closure *menu_item = (lttv_menu_closure *)user_data; + GtkWidget * tool_menu_title_menu, *insert_view; + + tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu"); + insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_menu_item, + menu_item->menuText); + if(insert_view){ + g_hash_table_remove(mw->hash_menu_item, menu_item->menuText); + gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view); + } +} + +void remove_toolbar_item(gpointer main_win, gpointer user_data) +{ + MainWindow * mw = (MainWindow *) main_win; + lttv_toolbar_closure *toolbar_item = (lttv_toolbar_closure *)user_data; + GtkWidget * tool_menu_title_menu, *insert_view; + + + tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1"); + insert_view = (GtkWidget*)g_hash_table_lookup(mw->hash_toolbar_item, + toolbar_item->tooltip); + if(insert_view){ + g_hash_table_remove(mw->hash_toolbar_item, toolbar_item->tooltip); + gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), insert_view); + } +} + +/** + * Remove menu and toolbar item when a module unloaded from all + * main windows + */ + +void main_window_remove_menu_item(lttvwindow_viewer_constructor constructor) +{ + int i; + LttvMenus * menu; + lttv_menu_closure *menu_item; + LttvAttributeValue value; + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + + g_assert(lttv_iattribute_find_by_path(attributes, + "viewers/menu", LTTV_POINTER, &value)); + menu = (LttvMenus*)*(value.v_pointer); + + if(menu){ + for(i=0;ilen;i++){ + menu_item = &g_array_index(menu, lttv_menu_closure, i); + if(menu_item->con != constructor) continue; + if(g_main_window_list){ + g_slist_foreach(g_main_window_list, remove_menu_item, menu_item); + } + break; + } + } + +} + +void main_window_remove_toolbar_item(lttvwindow_viewer_constructor constructor) +{ + int i; + LttvToolbars * toolbar; + lttv_toolbar_closure *toolbar_item; + LttvAttributeValue value; + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + + g_assert(lttv_iattribute_find_by_path(attributes, + "viewers/toolbar", LTTV_POINTER, &value)); + toolbar = (LttvToolbars*)*(value.v_pointer); + + if(toolbar){ + for(i=0;ilen;i++){ + toolbar_item = &g_array_index(toolbar, lttv_toolbar_closure, i); + if(toolbar_item->con != constructor) continue; + if(g_main_window_list){ + g_slist_foreach(g_main_window_list, remove_toolbar_item, toolbar_item); + } + break; + } + } +} + + + + /** * API parts */ @@ -633,27 +726,6 @@ void lttvwindow_time_interval_request(MainWindow *main_win, } } - - -/** - * Function to get the current time interval of the current traceset. - * It will be called by a viewer's hook function to update the - * time interval of the viewer and also be called by the constructor - * of the viewer. - * @param main_win the main window the viewer belongs to. - * @param time_interval a pointer where time interval will be stored. - */ - -const TimeInterval *lttvwindow_get_time_span(MainWindow *main_win) -{ - //time_window->start_time = main_win->current_tab->time_window.start_time; - //time_window->time_width = main_win->current_tab->time_window.time_width; - return (LTTV_TRACESET_CONTEXT(main_win->current_tab->traceset_info-> - traceset_context)->Time_Span); -} - - - /** * 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 diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.h b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.h index dbcc1752..0f0bd8e5 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.h +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/viewer.h @@ -32,6 +32,30 @@ every viewer that currently sits in memory so it can destroy them before the module gets unloaded/destroyed. +Main Window + +The main window is a container that offers menus, buttons and a notebook. Some +of those menus and buttons are part of the core of the main window, others +are dynamically added and removed when modules are loaded/unloaded. + +The notebook contains as much tabs as wanted. Each tab is linked with a +set of traces (traceset). Each trace contains many tracefiles (one per cpu). +A trace corresponds to a kernel being traced. A traceset corresponds to +many traces read together. The time span of a traceset goes from the +earliest start of all the traces to the latest end of all the traces. + +Inside each tab are added the viewers. When they interact with the main +window through the lttvwindow API, they affect the other viewers located +in the same tab as they are. + +The insertion of many viewers in a tab permits a quick look at all the +information wanted in a glance. The main window does merge the read requests +from all the viewers in the same tab in a way that every viewer will get exactly +the events it asked for, while the event reading loop and state update are +shared. It improves performance of events delivery to the viewers. + + + Viewer Instance Related API The lifetime of a viewer is as follows. The viewer constructor function is @@ -105,15 +129,17 @@ Requesting Events to Main Window Events can be requested by passing a EventsRequest structure to the main window. They will be delivered later when the next g_idle functions will be called. -Event delivery is done by calling the middle hook for this event ID, or the -main middle hooks. +Event delivery is done by calling the event hook for this event ID, or the +main event hooks. A pointer to the EventsRequest structure is passed as +hook_data to the event hooks of the viewers. EventsRequest consists in +- a pointer to the viewer specific data structure - a start timestamp or position - a stop_flag, ending the read process when set to TRUE - a end timestamp and/or position and/or number of events to read - hook lists to call for traceset/trace/tracefile begin and end, and for each - event (middle). + event (event hooks and event_by_id hooks). The main window will deliver events for every EventRequests it has pending through an algorithm that guarantee that all events requested, and only them, @@ -193,6 +219,18 @@ In the second case, with a pixmap buffer, the expose handler is only responsible of showing the pixmap buffer on the screen. If the pixmap buffer has never been filled with a drawing, the expose handler may ask for it to be filled. +The interest of using events request to the main window instead of reading the +events directly from the trace comes from the fact that the main window +does merge requests from the different viewers in the same tab so that the +read loop and the state update is shared. As viewers will, in the common +scenario, request the same events, only one pass through the trace that will +call the right hooks for the right intervals will be done. + +When the traceset read is over for a events request, the traceset_end hook is +called. It has the responsibility of finishing the drawing if some parts +still need to be drawn and to show it on the screen (if the viewer uses a pixmap +buffer). + It can add dotted lines and such visual effects to enhance the user's experience. @@ -215,9 +253,11 @@ FIXME : explain other important events #include #include +#include #include -#include +#include #include +#include //FIXME (not ready yet) #include @@ -541,18 +581,20 @@ void lttvwindow_report_focus(MainWindow *main_win, /* Structure sent to the time request hook */ /* Value considered as empty */ typedef struct _EventsRequest { - LttTime start_time, /* Unset : { 0, 0 } */ - LttvTracesetContextPosition start_position, /* Unset : num_traces = 0 */ - LttTime end_time, /* Unset : { 0, 0 } */ - guint num_events, /* Unset : G_MAXUINT */ - LttvTracesetContextPosition end_position, /* Unset : num_traces = 0 */ - LttvHooksById *before_traceset, /* Unset : NULL */ - LttvHooksById *before_trace, /* Unset : NULL */ - LttvHooksById *before_tracefile, /* Unset : NULL */ - LttvHooksById *middle, /* Unset : NULL */ - LttvHooksById *after_tracefile, /* Unset : NULL */ - LttvHooksById *after_trace, /* Unset : NULL */ - LttvHooksById *after_traceset /* Unset : NULL */ + LttTime start_time, /* Unset : { 0, 0 } */ + LttvTracesetContextPosition start_position, /* Unset : num_traces = 0 */ + gboolean stop_flag, /* Continue:TRUE Stop:FALSE */ + LttTime end_time, /* Unset : { 0, 0 } */ + guint num_events, /* Unset : G_MAXUINT */ + LttvTracesetContextPosition end_position, /* Unset : num_traces = 0 */ + LttvHooks *before_traceset, /* Unset : NULL */ + LttvHooks *before_trace, /* Unset : NULL */ + LttvHooks *before_tracefile, /* Unset : NULL */ + LttvHooks *event, /* Unset : NULL */ + LttvHooksById *event_by_id, /* Unset : NULL */ + LttvHooks *after_tracefile, /* Unset : NULL */ + LttvHooks *after_trace, /* Unset : NULL */ + LttvHooks *after_traceset /* Unset : NULL */ } EventsRequest; @@ -577,15 +619,6 @@ typedef struct _EventsRequest { void lttvwindow_events_request(MainWindow *main_win, EventsRequest events_request); -/** - * Function to get the life span of the traceset - * - * @param main_win the main window the viewer belongs to. - * @return pointer to a time interval : the life span of the traceset. - */ - -const TimeInterval *lttvwindow_get_time_span(MainWindow *main_win); - /** * Function to get the current time window of the current tab. *