create directories branches, tags, trunk
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index 4f2a9639e40fcd0fa4b201c835917764d27c1ff5..817044b89539fa1d7c069c31ca157960c18a7221 100644 (file)
@@ -32,7 +32,6 @@
 #include "interface.h"
 #include "support.h"
 #include <ltt/trace.h>
-#include <ltt/facility.h>
 #include <ltt/time.h>
 #include <ltt/event.h>
 #include <lttv/lttv.h>
@@ -46,7 +45,7 @@
 #include <lttvwindow/toolbar.h>
 #include <lttvwindow/lttvwindow.h>
 #include <lttvwindow/lttvwindowtraces.h>
-
+#include <lttvwindow/lttv_plugin_tab.h>
 
 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));
@@ -828,6 +892,10 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
 }
 
 /* lttvwindow_process_pending_requests
+ *
+ * Process requests for parts of the trace from viewers.
+ *
+ * These requests are made by lttvwindow_events_request().
  * 
  * This internal function gets called by g_idle, taking care of the pending
  * requests. It is responsible for concatenation of time intervals and position
@@ -863,6 +931,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;
@@ -1703,12 +1773,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");
@@ -1809,7 +1882,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); 
@@ -2028,7 +2103,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;
@@ -2051,7 +2128,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;
@@ -2079,7 +2158,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;
   
@@ -2092,6 +2173,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);
 }
@@ -2133,7 +2215,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;
@@ -2171,7 +2255,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,
@@ -2180,7 +2265,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);
@@ -2247,7 +2334,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);
 
@@ -2263,14 +2351,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
@@ -2988,7 +3088,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);
 
@@ -3007,7 +3107,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), "\
-<big>Linux Trace Toolkit</big>");
+<big>Linux Trace Toolkit " VERSION "</big>");
   gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_CENTER);
   
   GtkWidget *label2 = gtk_label_new("");
@@ -3026,12 +3126,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\
@@ -3279,6 +3379,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);
   
@@ -3391,6 +3492,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);
 
@@ -3581,6 +3719,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)
@@ -4040,11 +4313,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 */
@@ -4100,10 +4392,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));
   
@@ -4133,28 +4426,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);
@@ -4224,6 +4518,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();
@@ -4263,6 +4566,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, 
@@ -4274,6 +4578,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, 
@@ -4310,7 +4627,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;
     
@@ -4331,6 +4655,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);
@@ -4378,6 +4712,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),
@@ -4439,12 +4777,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);
@@ -4467,6 +4802,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);
@@ -4499,8 +4840,6 @@ Tab* create_tab(MainWindow * mw, Tab *copy_tab,
  
   LttvTraceset *traceset = tab->traceset_info->traceset;
   SetTraceset(tab, traceset);
-
-  return tab;
 }
 
 /*
@@ -4516,9 +4855,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);
@@ -4527,45 +4866,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;
This page took 0.0322 seconds and 4 git commands to generate.