X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Flttvwindow%2Flttvwindow%2Fcallbacks.c;h=d2c2d54f1ee608ebe3c565facf77075efb7f2606;hb=5698740e7329b8a34faf0c178ff44a5e21654cdc;hp=8571eb25d03076414f69a34b8b380b89d0ab8278;hpb=8321ae6a5238e9fda9d9517c9eec8d1a2980dfd2;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 8571eb25..d2c2d54f 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -46,7 +46,7 @@ #include #include #include - +#include static LttTime lttvwindow_default_time_width = { 1, 0 }; #define CLIP_BUF 256 // size of clipboard buffer @@ -61,6 +61,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 +71,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 +302,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 +424,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 +764,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 +798,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 +839,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)); @@ -1090,6 +1155,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 +1165,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 +1768,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 +1806,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 +1877,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 +2098,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 +2123,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 +2153,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 +2168,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 +2210,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 +2250,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 +2260,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 +2329,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 +2346,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 @@ -3259,6 +3374,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 +3487,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 +3714,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,62 +4308,72 @@ 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"); - /* First window, use command line trace */ - if(g_init_trace != NULL){ - lttvwindow_add_trace(new_tab, - g_init_trace); + 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 */ + { + LttvAttributeType type; + LttvAttributeName name; + LttvAttributeValue value; + LttvAttribute *attribute; + + LttvIAttribute *attributes_global = + LTTV_IATTRIBUTE(lttv_global_attributes()); + + g_assert(attribute = + LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(attributes_global), + LTTV_VIEWER_CONSTRUCTORS))); + + name = g_quark_from_string("guievents"); + type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), + name, &value); + if(type == LTTV_POINTER) { + lttvwindow_viewer_constructor viewer_constructor = + (lttvwindow_viewer_constructor)*value.v_pointer; + insert_viewer(new_window, viewer_constructor); } - LttvTraceset *traceset = new_tab->traceset_info->traceset; - SetTraceset(new_tab, traceset); - - /* Insert default viewers */ - { - LttvAttributeType type; - LttvAttributeName name; - LttvAttributeValue value; - LttvAttribute *attribute; - - LttvIAttribute *attributes_global = - LTTV_IATTRIBUTE(lttv_global_attributes()); - - g_assert(attribute = - LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( - LTTV_IATTRIBUTE(attributes_global), - LTTV_VIEWER_CONSTRUCTORS))); - - name = g_quark_from_string("guievents"); - type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), - name, &value); - if(type == LTTV_POINTER) { - lttvwindow_viewer_constructor viewer_constructor = - (lttvwindow_viewer_constructor)*value.v_pointer; - insert_viewer(new_window, viewer_constructor); - } - name = g_quark_from_string("guicontrolflow"); - type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), - name, &value); - if(type == LTTV_POINTER) { - lttvwindow_viewer_constructor viewer_constructor = - (lttvwindow_viewer_constructor)*value.v_pointer; - insert_viewer(new_window, viewer_constructor); - } - - name = g_quark_from_string("guistatistics"); - type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), - name, &value); - if(type == LTTV_POINTER) { - lttvwindow_viewer_constructor viewer_constructor = - (lttvwindow_viewer_constructor)*value.v_pointer; - insert_viewer(new_window, viewer_constructor); - } + name = g_quark_from_string("guicontrolflow"); + type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), + name, &value); + if(type == LTTV_POINTER) { + lttvwindow_viewer_constructor viewer_constructor = + (lttvwindow_viewer_constructor)*value.v_pointer; + insert_viewer(new_window, viewer_constructor); + } + name = g_quark_from_string("guistatistics"); + type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute), + name, &value); + if(type == LTTV_POINTER) { + lttvwindow_viewer_constructor viewer_constructor = + (lttvwindow_viewer_constructor)*value.v_pointer; + insert_viewer(new_window, viewer_constructor); } } @@ -4089,10 +4387,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)); @@ -4122,28 +4421,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); @@ -4213,6 +4513,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(); @@ -4252,6 +4561,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, @@ -4263,6 +4573,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, @@ -4299,7 +4622,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; @@ -4320,6 +4650,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); @@ -4367,6 +4707,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), @@ -4428,12 +4772,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); @@ -4456,6 +4797,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); @@ -4488,8 +4835,6 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, LttvTraceset *traceset = tab->traceset_info->traceset; SetTraceset(tab, traceset); - - return tab; } /* @@ -4505,9 +4850,9 @@ gboolean execute_events_requests(Tab *tab) } -void create_main_window_with_trace(gchar *path) +void create_main_window_with_trace_list(GSList *traces) { - if(path == NULL) return; + GSList *iter = NULL; /* Create window */ MainWindow *mw = construct_main_window(NULL); @@ -4516,34 +4861,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); + 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;