X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Flttvwindow%2Flttvwindow%2Fcallbacks.c;h=09e6656369f4fc39de03b4e570931dcb4b2a4379;hb=f464e5e3f8605404eb62da03babdb6bcaa5bab3c;hp=68613041043e98f320463b476c63b79406fc95b2;hpb=53f7650947800f2d8858f8824d1d4bf7368b6192;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c index 68613041..09e66563 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -32,7 +32,6 @@ #include "interface.h" #include "support.h" #include -#include #include #include #include @@ -46,7 +45,7 @@ #include #include #include - +#include static LttTime lttvwindow_default_time_width = { 1, 0 }; #define CLIP_BUF 256 // size of clipboard buffer @@ -61,6 +60,7 @@ extern GSList * g_main_window_list; static char remember_plugins_dir[PATH_MAX] = ""; static char remember_trace_dir[PATH_MAX] = ""; +void tab_destructor(LttvPluginTab * ptab); MainWindow * get_window_data_struct(GtkWidget * widget); char * get_load_module(MainWindow *mw, @@ -70,12 +70,12 @@ char * get_unload_module(MainWindow *mw, char * get_remove_trace(MainWindow *mw, char ** all_trace_name, int nb_trace); char * get_selection(MainWindow *mw, char ** all_name, int nb, char *title, char * column_title); -Tab* create_tab(MainWindow * mw, Tab *copy_tab, +void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, GtkNotebook * notebook, char * label); static void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor); -Tab *create_new_tab(GtkWidget* widget, gpointer user_data); +LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data); static gboolean lttvwindow_process_pending_requests(Tab *tab); @@ -301,7 +301,63 @@ static gboolean on_MEventBox5b_paste(GtkWidget *widget, GdkEventButton *event, return 0; } +/* Interval */ +static void MEventBox8_receive(GtkClipboard *clipboard, + const gchar *text, + gpointer data) +{ + if(text == NULL) return; + Tab *tab = (Tab *)data; + gchar buffer[CLIP_BUF]; + gchar *ptr = buffer, *ptr_sec, *ptr_nsec; + + strncpy(buffer, text, CLIP_BUF); + + while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; + /* remove leading junk */ + ptr_sec = ptr; + while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; + /* read all the first number */ + *ptr = '\0'; + ptr++; + + while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; + /* remove leading junk */ + ptr_nsec = ptr; + while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++; + /* read all the first number */ + *ptr = '\0'; + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7), + (double)strtoul(ptr_sec, NULL, 10)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8), + (double)strtoul(ptr_nsec, NULL, 10)); +} + +/* Interval */ +static gboolean on_MEventBox8_paste(GtkWidget *widget, GdkEventButton *event, + gpointer data) +{ + Tab *tab = (Tab*)data; + + GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(), + GDK_SELECTION_PRIMARY); + gtk_clipboard_request_text(clip, + (GtkClipboardTextReceivedFunc)MEventBox8_receive, + (gpointer)tab); + return 0; +} + +#if 0 +static void on_top_notify(GObject *gobject, + GParamSpec *arg1, + gpointer user_data) +{ + Tab *tab = (Tab*)user_data; + g_message("in on_top_notify.\n"); +} +#endif //0 static gboolean viewer_grab_focus(GtkWidget *widget, GdkEventButton *event, gpointer data) { @@ -367,17 +423,19 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor) TimeInterval * time_interval; GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); + LttvPluginTab *ptab; Tab *tab; if(!page) { - tab = create_new_tab(widget, NULL); + ptab = create_new_tab(widget, NULL); } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); } + tab = ptab->tab; viewer_container = tab->viewer_container; - viewer = (GtkWidget*)constructor(tab); + viewer = (GtkWidget*)constructor(ptab); if(viewer) { //gtk_multivpaned_widget_add(GTK_MULTIVPANED(multivpaned), viewer); @@ -705,7 +763,9 @@ void move_down_viewer(GtkWidget * widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } //gtk_multivpaned_widget_move_up(GTK_MULTIVPANED(tab->multivpaned)); @@ -737,7 +797,9 @@ void move_up_viewer(GtkWidget * widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } //gtk_multivpaned_widget_move_down(GTK_MULTIVPANED(tab->multivpaned)); @@ -776,7 +838,9 @@ void delete_viewer(GtkWidget * widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } //gtk_multivpaned_widget_delete(GTK_MULTIVPANED(tab->multivpaned)); @@ -863,6 +927,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) guint count; LttvTracesetContextPosition *end_position; + if(lttvwindow_preempt_count > 0) return TRUE; + if(tab == NULL) { g_critical("Foreground processing : tab does not exist. Processing removed."); return FALSE; @@ -1090,6 +1156,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) } else { LttTime pos_time; + LttvTracefileContext *tfc = + lttv_traceset_context_get_current_tfc(tsc); /* Else, the first request in list_in is a position request */ /* If first req in list_in pos != current pos */ g_assert(events_request->start_position != NULL); @@ -1098,10 +1166,16 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) events_request->start_position).tv_sec, lttv_traceset_context_position_get_time( events_request->start_position).tv_nsec); - - g_debug("SEEK POS context time : %lu, %lu", - lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_sec, - lttv_traceset_context_get_current_tfc(tsc)->timestamp.tv_nsec); + + if(tfc) { + g_debug("SEEK POS context time : %lu, %lu", + tfc->timestamp.tv_sec, + tfc->timestamp.tv_nsec); + } else { + g_debug("SEEK POS context time : %lu, %lu", + ltt_time_infinite.tv_sec, + ltt_time_infinite.tv_nsec); + } g_assert(events_request->start_position != NULL); if(lttv_traceset_context_ctx_pos_compare(tsc, events_request->start_position) != 0) { @@ -1695,12 +1769,15 @@ void add_trace(GtkWidget * widget, gpointer user_data) GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); + LttvPluginTab *ptab; Tab *tab; if(!page) { - tab = create_new_tab(widget, NULL); + ptab = create_new_tab(widget, NULL); + tab = ptab->tab; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } //GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace"); @@ -1730,6 +1807,18 @@ void add_trace(GtkWidget * widget, gpointer user_data) trace = ltt_trace_open(abs_path); if(trace == NULL) { g_warning("cannot open trace %s", abs_path); + + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "Cannot open trace : maybe you should enter in the trace " + "directory to select it ?"); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + } else { trace_v = lttv_trace_new(trace); lttvwindowtraces_add_trace(trace_v); @@ -1789,7 +1878,9 @@ void remove_trace(GtkWidget *widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } nb_trace =lttv_traceset_number(tab->traceset_info->traceset); @@ -2008,7 +2099,9 @@ void redraw(GtkWidget *widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } LttvHooks * tmp; @@ -2031,7 +2124,9 @@ void continue_processing(GtkWidget *widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } LttvHooks * tmp; @@ -2059,7 +2154,9 @@ void stop_processing(GtkWidget *widget, gpointer user_data) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } GSList *iter = tab->events_requests; @@ -2072,6 +2169,7 @@ void stop_processing(GtkWidget *widget, gpointer user_data) g_slist_remove_link(tab->events_requests, remove_iter); } tab->events_request_pending = FALSE; + tab->stop_foreground = TRUE; g_idle_remove_by_data(tab); g_assert(g_slist_length(tab->events_requests) == 0); } @@ -2113,7 +2211,9 @@ void zoom(GtkWidget * widget, double size) if(!page) { return; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } if(size == 1) return; @@ -2151,7 +2251,8 @@ void zoom(GtkWidget * widget, double size) new_time_window.end_time = ltt_time_add(new_time_window.start_time, new_time_window.time_width) ; /* If on borders, don't fall off */ - if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0) + if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0 + || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0) { new_time_window.start_time = time_span.start_time; new_time_window.end_time = ltt_time_add(new_time_window.start_time, @@ -2160,7 +2261,9 @@ void zoom(GtkWidget * widget, double size) else { if(ltt_time_compare(new_time_window.end_time, - time_span.end_time) > 0) + time_span.end_time) > 0 + || ltt_time_compare(new_time_window.end_time, + time_span.start_time) < 0) { new_time_window.start_time = ltt_time_sub(time_span.end_time, new_time_window.time_width); @@ -2227,7 +2330,8 @@ on_clone_traceset_activate (GtkMenuItem *menuitem, /* create_new_tab calls create_tab to construct a new tab in the main window */ -Tab *create_new_tab(GtkWidget* widget, gpointer user_data){ +LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data) +{ gchar label[PATH_MAX]; MainWindow * mw_data = get_window_data_struct(widget); @@ -2243,14 +2347,26 @@ Tab *create_new_tab(GtkWidget* widget, gpointer user_data){ if(!page) { copy_tab = NULL; } else { - copy_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + copy_tab = ptab->tab; } strcpy(label,"Page"); - if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name")) - return (create_tab (mw_data, copy_tab, notebook, label)); - else - return NULL; + if(get_label(mw_data, label,"Get the name of the tab","Please input tab's name")) { + LttvPluginTab *ptab; + + ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL); + init_tab (ptab->tab, mw_data, copy_tab, notebook, label); + ptab->parent.top_widget = ptab->tab->top_widget; + g_object_set_data_full( + G_OBJECT(ptab->tab->vbox), + "Tab_Plugin", + ptab, + (GDestroyNotify)tab_destructor); + return ptab; + } + else return NULL; } void @@ -2968,7 +3084,7 @@ on_about_activate (GtkMenuItem *menuitem, gtk_window_set_title(about_window, "About Linux Trace Toolkit"); gtk_window_set_resizable(about_window, FALSE); - gtk_window_set_transient_for(GTK_WINDOW(window_widget), about_window); + gtk_window_set_transient_for(about_window, GTK_WINDOW(window_widget)); gtk_window_set_destroy_with_parent(about_window, TRUE); gtk_window_set_modal(about_window, FALSE); @@ -2987,7 +3103,7 @@ on_about_activate (GtkMenuItem *menuitem, GtkWidget *label1 = gtk_label_new(""); gtk_misc_set_padding(GTK_MISC(label1), 10, 20); gtk_label_set_markup(GTK_LABEL(label1), "\ -Linux Trace Toolkit"); +Linux Trace Toolkit " VERSION ""); gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_CENTER); GtkWidget *label2 = gtk_label_new(""); @@ -3006,12 +3122,12 @@ Xang-Xiu Yang (new trace reading library and converter, lttv gui, \n\ detailed event list and statistics view)\n\ Tom Zanussi (RelayFS)\n\ \n\ -Strongly inspired from the original Linux Trace Toolkit Visualizer made by\n\ +Inspired from the original Linux Trace Toolkit Visualizer made by\n\ Karim Yaghmour"); GtkWidget *label3 = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label3), "\ -Linux Trace Toolkit Viewer, Copyright (C) 2004\n\ +Linux Trace Toolkit Viewer, Copyright (C) 2004, 2005, 2006\n\ Michel Dagenais\n\ Mathieu Desnoyers\n\ Xang-Xiu Yang\n\ @@ -3259,6 +3375,7 @@ void time_change_manager (Tab *tab, TimeInterval time_span = tsc->time_span; LttTime start_time = new_time_window.start_time; LttTime end_time = new_time_window.end_time; + LttTime time_width = new_time_window.time_width; g_assert(ltt_time_compare(start_time, end_time) < 0); @@ -3371,6 +3488,43 @@ void time_change_manager (Tab *tab, gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4), (double)end_time.tv_nsec); + /* width seconds */ + if(time_width.tv_nsec == 0) { + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7), + (double)1, + (double)upper.tv_sec); + } else { + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7), + (double)0, + (double)upper.tv_sec); + } + gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7), + (double)time_width.tv_sec); + + /* width nanoseconds */ + if(time_width.tv_sec == upper.tv_sec) { + if(time_width.tv_sec == 0) { + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), + (double)1, + (double)upper.tv_nsec); + } else { + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), + (double)0, + (double)upper.tv_nsec); + } + } + else if(time_width.tv_sec == 0) { + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), + 1.0, + (double)upper.tv_nsec); + } + else /* anywhere else */ + gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8), + 0.0, + (double)NANOSECONDS_PER_SECOND-1); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8), + (double)time_width.tv_nsec); + /* call viewer hooks for new time window */ set_time_window(tab, &new_time_window); @@ -3561,6 +3715,141 @@ on_MEntry4_value_changed (GtkSpinButton *spinbutton, } +/* value changed for time frame interval s + * + * Check time span : if ns is out of range, clip it the nearest good value. + */ +void +on_MEntry7_value_changed (GtkSpinButton *spinbutton, + gpointer user_data) +{ + Tab *tab =(Tab *)user_data; + LttvTracesetContext * tsc = + LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); + TimeInterval time_span = tsc->time_span; + gint value = gtk_spin_button_get_value_as_int(spinbutton); + LttTime current_time, time_delta; + TimeWindow new_time_window = tab->time_window; + current_time = tab->current_time; + + time_delta = ltt_time_sub(time_span.end_time,time_span.start_time); + new_time_window.time_width.tv_sec = value; + new_time_window.time_width_double = + ltt_time_to_double(new_time_window.time_width); + if(ltt_time_compare(new_time_window.time_width,time_delta) > 0) + { /* Case where zoom out is bigger than trace length */ + new_time_window.start_time = time_span.start_time; + new_time_window.time_width = time_delta; + new_time_window.time_width_double = ltt_time_to_double(time_delta); + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + else + { + /* Center the image on the current time */ + new_time_window.start_time = + ltt_time_sub(current_time, + ltt_time_from_double(new_time_window.time_width_double/2.0)); + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + /* If on borders, don't fall off */ + if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0 + || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0) + { + new_time_window.start_time = time_span.start_time; + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + else + { + if(ltt_time_compare(new_time_window.end_time, + time_span.end_time) > 0 + || ltt_time_compare(new_time_window.end_time, + time_span.start_time) < 0) + { + new_time_window.start_time = + ltt_time_sub(time_span.end_time, new_time_window.time_width); + + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + } + + } + + if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) { + g_warning("Zoom more than 1 ns impossible"); + } else { + time_change_manager(tab, new_time_window); + } +} + +void +on_MEntry8_value_changed (GtkSpinButton *spinbutton, + gpointer user_data) +{ + Tab *tab =(Tab *)user_data; + LttvTracesetContext * tsc = + LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); + TimeInterval time_span = tsc->time_span; + gint value = gtk_spin_button_get_value_as_int(spinbutton); + LttTime current_time, time_delta; + TimeWindow new_time_window = tab->time_window; + current_time = tab->current_time; + + time_delta = ltt_time_sub(time_span.end_time,time_span.start_time); + new_time_window.time_width.tv_nsec = value; + new_time_window.time_width_double = + ltt_time_to_double(new_time_window.time_width); + if(ltt_time_compare(new_time_window.time_width,time_delta) > 0) + { /* Case where zoom out is bigger than trace length */ + new_time_window.start_time = time_span.start_time; + new_time_window.time_width = time_delta; + new_time_window.time_width_double = ltt_time_to_double(time_delta); + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + else + { + /* Center the image on the current time */ + new_time_window.start_time = + ltt_time_sub(current_time, + ltt_time_from_double(new_time_window.time_width_double/2.0)); + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + /* If on borders, don't fall off */ + if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0 + || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0) + { + new_time_window.start_time = time_span.start_time; + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + else + { + if(ltt_time_compare(new_time_window.end_time, + time_span.end_time) > 0 + || ltt_time_compare(new_time_window.end_time, + time_span.start_time) < 0) + { + new_time_window.start_time = + ltt_time_sub(time_span.end_time, new_time_window.time_width); + + new_time_window.end_time = ltt_time_add(new_time_window.start_time, + new_time_window.time_width) ; + } + } + + } + + if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) { + g_warning("Zoom more than 1 ns impossible"); + } else { + time_change_manager(tab, new_time_window); + } +} + + void current_time_change_manager (Tab *tab, LttTime new_current_time) @@ -4020,11 +4309,30 @@ MainWindow *construct_main_window(MainWindow * parent) if(!page) { parent_tab = NULL; } else { - parent_tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + LttvPluginTab *ptab; + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + parent_tab = ptab->tab; } - new_tab = create_tab(new_m_window, parent_tab, notebook, "Traceset"); + LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL); + init_tab(ptab->tab, + new_m_window, parent_tab, notebook, "Traceset"); + ptab->parent.top_widget = ptab->tab->top_widget; + g_object_set_data_full( + G_OBJECT(ptab->tab->vbox), + "Tab_Plugin", + ptab, + (GDestroyNotify)tab_destructor); + new_tab = ptab->tab; } else { - new_tab = create_tab(new_m_window, NULL, notebook, "Traceset"); + LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL); + init_tab(ptab->tab, new_m_window, NULL, notebook, "Traceset"); + ptab->parent.top_widget = ptab->tab->top_widget; + g_object_set_data_full( + G_OBJECT(ptab->tab->vbox), + "Tab_Plugin", + ptab, + (GDestroyNotify)tab_destructor); + new_tab = ptab->tab; } /* Insert default viewers */ @@ -4080,10 +4388,11 @@ MainWindow *construct_main_window(MainWindow * parent) * destroy the tab */ -void tab_destructor(Tab * tab) +void tab_destructor(LttvPluginTab * ptab) { int i, nb, ref_count; LttvTrace * trace; + Tab *tab = ptab->tab; gtk_object_destroy(GTK_OBJECT(tab->tooltips)); @@ -4113,28 +4422,29 @@ void tab_destructor(Tab * tab) } } } - lttv_filter_destroy(tab->filter); lttv_traceset_destroy(tab->traceset_info->traceset); /* Remove the idle events requests processing function of the tab */ g_idle_remove_by_data(tab); g_slist_free(tab->events_requests); g_free(tab->traceset_info); - g_free(tab); + //g_free(tab); + g_object_unref(ptab); } /* Create a tab and insert it into the current main window */ -Tab* create_tab(MainWindow * mw, Tab *copy_tab, +void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, GtkNotebook * notebook, char * label) { GList * list; - Tab * tab; + //Tab * tab; + //LttvFilter *filter = NULL; //create a new tab data structure - tab = g_new(Tab,1); + //tab = g_new(Tab,1); //construct and initialize the traceset_info tab->traceset_info = g_new(TracesetInfo,1); @@ -4204,6 +4514,15 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, tab->interrupted_state = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); tab->vbox = gtk_vbox_new(FALSE, 2); + tab->top_widget = tab->vbox; + //g_object_set_data_full(G_OBJECT(tab->top_widget), "filter", +// filter, (GDestroyNotify)lttv_filter_destroy); + +// g_signal_connect (G_OBJECT(tab->top_widget), +// "notify", +// G_CALLBACK (on_top_notify), +// (gpointer)tab); + tab->viewer_container = gtk_vbox_new(TRUE, 2); tab->scrollbar = gtk_hscrollbar_new(NULL); //tab->multivpaned = gtk_multi_vpaned_new(); @@ -4243,6 +4562,7 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, gtk_widget_show(tab->MText2); tab->MText3a = gtk_label_new("ns"); gtk_widget_show(tab->MText3a); + tab->MEventBox3b = gtk_event_box_new(); gtk_widget_show(tab->MEventBox3b); gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox3b, @@ -4254,6 +4574,19 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, gtk_widget_show(tab->MText4); tab->MText5a = gtk_label_new("ns"); gtk_widget_show(tab->MText5a); + + tab->MEventBox8 = gtk_event_box_new(); + gtk_widget_show(tab->MEventBox8); + gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox8, + "Paste Time Interval here", ""); + tab->MText8 = gtk_label_new("Time Interval:"); + gtk_widget_show(tab->MText8); + gtk_container_add(GTK_CONTAINER(tab->MEventBox8), tab->MText8); + tab->MText9 = gtk_label_new("s"); + gtk_widget_show(tab->MText9); + tab->MText10 = gtk_label_new("ns"); + gtk_widget_show(tab->MText10); + tab->MEventBox5b = gtk_event_box_new(); gtk_widget_show(tab->MEventBox5b); gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox5b, @@ -4290,7 +4623,14 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry6),0); gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry6),TRUE); gtk_widget_show(tab->MEntry6); - + tab->MEntry7 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry7),0); + gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry7),TRUE); + gtk_widget_show(tab->MEntry7); + tab->MEntry8 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry8),0); + gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry8),TRUE); + gtk_widget_show(tab->MEntry8); GtkWidget *temp_widget; @@ -4311,6 +4651,16 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText4, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry4, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText5a, FALSE, FALSE, 0); + temp_widget = gtk_vseparator_new(); + gtk_widget_show(temp_widget); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox8, FALSE, + FALSE, 0); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry7, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText9, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry8, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText10, FALSE, FALSE, 0); + temp_widget = gtk_vseparator_new(); gtk_widget_show(temp_widget); gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText7, FALSE, FALSE, 0); @@ -4358,6 +4708,10 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, "button-press-event", G_CALLBACK (on_MEventBox5b_paste), (gpointer)tab); + g_signal_connect (G_OBJECT(tab->MEventBox8), + "button-press-event", + G_CALLBACK (on_MEventBox8_paste), + (gpointer)tab); } gtk_box_pack_end(GTK_BOX(tab->vbox), @@ -4419,12 +4773,9 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, /* Start with empty events requests list */ tab->events_requests = NULL; tab->events_request_pending = FALSE; + tab->stop_foreground = FALSE; + - g_object_set_data_full( - G_OBJECT(tab->vbox), - "Tab_Info", - tab, - (GDestroyNotify)tab_destructor); g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed", G_CALLBACK(scroll_value_changed_cb), tab); @@ -4447,6 +4798,12 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, g_signal_connect ((gpointer) tab->MEntry6, "value-changed", G_CALLBACK (on_MEntry6_value_changed), tab); + g_signal_connect ((gpointer) tab->MEntry7, "value-changed", + G_CALLBACK (on_MEntry7_value_changed), + tab); + g_signal_connect ((gpointer) tab->MEntry8, "value-changed", + G_CALLBACK (on_MEntry8_value_changed), + tab); //g_signal_connect(G_OBJECT(tab->scrollbar), "changed", // G_CALLBACK(scroll_value_changed_cb), tab); @@ -4479,8 +4836,6 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, LttvTraceset *traceset = tab->traceset_info->traceset; SetTraceset(tab, traceset); - - return tab; } /* @@ -4496,9 +4851,9 @@ gboolean execute_events_requests(Tab *tab) } -void create_main_window_with_trace(gchar *path) +__EXPORT void create_main_window_with_trace_list(GSList *traces) { - if(path == NULL) return; + GSList *iter = NULL; /* Create window */ MainWindow *mw = construct_main_window(NULL); @@ -4507,45 +4862,51 @@ void create_main_window_with_trace(gchar *path) GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); + LttvPluginTab *ptab; Tab *tab; if(!page) { - tab = create_new_tab(widget, NULL); + ptab = create_new_tab(widget, NULL); + tab = ptab->tab; } else { - tab = (Tab *)g_object_get_data(G_OBJECT(page), "Tab_Info"); + ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin"); + tab = ptab->tab; } - /* Add trace */ - gchar abs_path[PATH_MAX]; - LttvTrace *trace_v; - LttTrace *trace; - - get_absolute_pathname(path, abs_path); - trace_v = lttvwindowtraces_get_trace_by_name(abs_path); - if(trace_v == NULL) { - trace = ltt_trace_open(abs_path); - if(trace == NULL) { - g_warning("cannot open trace %s", abs_path); - - GtkWidget *dialogue = - gtk_message_dialog_new( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "Cannot open trace : maybe you should enter in the directory" - "to select it ?"); - gtk_dialog_run(GTK_DIALOG(dialogue)); - gtk_widget_destroy(dialogue); + for(iter=traces; iter!=NULL; iter=g_slist_next(iter)) { + gchar *path = (gchar*)iter->data; + /* Add trace */ + gchar abs_path[PATH_MAX]; + LttvTrace *trace_v; + LttTrace *trace; + + get_absolute_pathname(path, abs_path); + trace_v = lttvwindowtraces_get_trace_by_name(abs_path); + if(trace_v == NULL) { + trace = ltt_trace_open(abs_path); + if(trace == NULL) { + g_warning("cannot open trace %s", abs_path); + + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "Cannot open trace : maybe you should enter in the directory " + "to select it ?"); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + } else { + trace_v = lttv_trace_new(trace); + lttvwindowtraces_add_trace(trace_v); + lttvwindow_add_trace(tab, trace_v); + } } else { - trace_v = lttv_trace_new(trace); - lttvwindowtraces_add_trace(trace_v); lttvwindow_add_trace(tab, trace_v); } - } else { - lttvwindow_add_trace(tab, trace_v); } - + LttvTraceset *traceset; traceset = tab->traceset_info->traceset;