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=70e6cb7dcbe55e694eabadab9769968b93a1d4b9;hpb=c75dd04efb1eb0108b8ff77f574acf7620055a93;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 70e6cb7d..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); @@ -348,7 +348,16 @@ static gboolean on_MEventBox8_paste(GtkWidget *widget, GdkEventButton *event, 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) { @@ -414,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); @@ -752,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)); @@ -784,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)); @@ -823,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)); @@ -910,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; @@ -1750,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"); @@ -1856,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); @@ -2075,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; @@ -2098,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; @@ -2126,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; @@ -2139,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); } @@ -2180,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; @@ -2297,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); @@ -2313,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 @@ -3038,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); @@ -3057,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(""); @@ -3076,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\ @@ -3443,9 +3489,15 @@ void time_change_manager (Tab *tab, (double)end_time.tv_nsec); /* width seconds */ - gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7), - (double)0, - (double)upper.tv_sec); + 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); @@ -4257,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 */ @@ -4317,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)); @@ -4350,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); @@ -4441,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(); @@ -4691,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); @@ -4757,8 +4836,6 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab, LttvTraceset *traceset = tab->traceset_info->traceset; SetTraceset(tab, traceset); - - return tab; } /* @@ -4774,9 +4851,9 @@ gboolean execute_events_requests(Tab *tab) } -void create_main_window_with_trace(const 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); @@ -4785,45 +4862,51 @@ void create_main_window_with_trace(const 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;