update compat
[lttv.git] / ltt / branches / poly / lttv / modules / gui / filter / filter.c
index 351944bbbe13bbdf94aa57eff4ce47a1fe448373..dab7d1f3125ac305d4a4a1a2babdf8721d209cf3 100644 (file)
  * MA 02111-1307, USA.
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <glib.h>
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include <lttv/lttv.h>
 #include <lttv/module.h>
@@ -31,6 +36,9 @@
 
 #include "hGuiFilterInsert.xpm"
 
+
+GSList *g_filter_list = NULL ;
+
 /*! \file lttv/modules/gui/filter/filter.c
  *  \brief Graphic filter interface.
  *
@@ -65,6 +73,9 @@ void filter_destroy_walk(gpointer data, gpointer user_data);
  * Callback functions
  */
 void callback_process_button(GtkWidget *widget, gpointer data);
+gboolean callback_enter_check(GtkWidget *widget,
+    GdkEventKey *event,
+    gpointer user_data);
 void callback_add_button(GtkWidget *widget, gpointer data);
 void callback_logical_op_box(GtkWidget *widget, gpointer data);
 void callback_expression_field(GtkWidget *widget, gpointer data);
@@ -96,6 +107,8 @@ struct _FilterViewerDataLine {
 struct _FilterViewerData {
   Tab *tab;                             /**< current tab of module */
 
+  GtkWidget *f_window;                  /**< filter window */
+  
   GtkWidget *f_main_box;                /**< main container */
 
   GtkWidget *f_expression_field;        /**< entire expression (GtkEntry) */
@@ -112,7 +125,7 @@ struct _FilterViewerData {
   GPtrArray *f_math_op_options;         /**< array of operators types for math_op box */
   
   GtkWidget *f_add_button;              /**< add expression to current expression (GtkButton) */
-  
 };
 
 /**
@@ -126,7 +139,7 @@ struct _FilterViewerData {
 GtkWidget*
 guifilter_get_widget(FilterViewerData *fvd)
 {
-  return fvd->f_main_box;
+  return fvd->f_window;
 }
 
 /**
@@ -139,7 +152,7 @@ guifilter_get_widget(FilterViewerData *fvd)
 FilterViewerData*
 gui_filter(Tab *tab)
 {
-  g_print("filter::gui_filter()");
+  g_debug("filter::gui_filter()");
 
   unsigned i;
   GtkCellRenderer *renderer;
@@ -172,6 +185,7 @@ gui_filter(Tab *tab)
   fvd->f_field_options = g_ptr_array_new(); //g_array_new(FALSE,FALSE,16);
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new(""));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.name"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.facility"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.category"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.time"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.tsc"));
@@ -180,6 +194,8 @@ gui_filter(Tab *tab)
    */
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("tracefile.name"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("trace.name"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.process_name"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.thread_brand"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.pid"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.ppid"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.creation_time"));
@@ -199,6 +215,12 @@ gui_filter(Tab *tab)
   g_ptr_array_add(fvd->f_math_op_options,(gpointer) g_string_new(">="));
   
 
+  fvd->f_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title(GTK_WINDOW(fvd->f_window), "LTTV Filter");
+  gtk_window_set_transient_for(GTK_WINDOW(fvd->f_window),
+      GTK_WINDOW(main_window_get_widget(tab)));
+  gtk_window_set_destroy_with_parent(GTK_WINDOW(fvd->f_window), TRUE);
+
   /* 
    * Initiating GtkTable layout 
    * starts with 2 rows and 5 columns and 
@@ -208,12 +230,16 @@ gui_filter(Tab *tab)
   gtk_table_set_row_spacings(GTK_TABLE(fvd->f_main_box),5);
   gtk_table_set_col_spacings(GTK_TABLE(fvd->f_main_box),5);
   
+  gtk_container_add(GTK_CONTAINER(fvd->f_window), GTK_WIDGET(fvd->f_main_box));
+  
   /*
    *  First half of the filter window
    *  - textual entry of filter expression
    *  - processing button
    */
   fvd->f_expression_field = gtk_entry_new(); //gtk_scrolled_window_new (NULL, NULL);
+  g_signal_connect (G_OBJECT(fvd->f_expression_field),
+      "key-press-event", G_CALLBACK (callback_enter_check), (gpointer)fvd);
 //  gtk_entry_set_text(GTK_ENTRY(fvd->f_expression_field),"state.cpu>0");
   gtk_widget_show (fvd->f_expression_field);
 
@@ -254,6 +280,8 @@ gui_filter(Tab *tab)
  
   gtk_table_attach( GTK_TABLE(fvd->f_main_box),fvd->f_logical_op_junction_box,0,1,1,2,GTK_SHRINK,GTK_FILL,0,0);
 
+  gtk_container_set_border_width(GTK_CONTAINER(fvd->f_main_box), 1);
+  
   /* initialize a new line */
   fvd->f_lines = g_ptr_array_new();
   fvd->rows = 1;
@@ -264,6 +292,7 @@ gui_filter(Tab *tab)
    * show main container 
    */
   gtk_widget_show(fvd->f_main_box);
+  gtk_widget_show(fvd->f_window);
   
   
   g_object_set_data_full(
@@ -272,6 +301,9 @@ gui_filter(Tab *tab)
       fvd,
       (GDestroyNotify)gui_filter_destructor);
 
+  g_filter_list = g_slist_append(
+      g_filter_list,
+      fvd);
   
   return fvd;
 }
@@ -403,7 +435,9 @@ gui_filter_destructor(FilterViewerData *fvd)
 //                                          filter_viewer_data);
 //  }
   lttvwindowtraces_background_notify_remove(fvd);
-
+  
+  g_filter_list = g_slist_remove(g_filter_list, fvd);
   g_free(fvd);
 }
 
@@ -423,10 +457,7 @@ h_guifilter(Tab *tab)
 {
   FilterViewerData* f = gui_filter(tab) ;
 
-  if(f)
-    return guifilter_get_widget(f);
-  else return NULL;
-  
+  return NULL;
 }
 
 /**
@@ -471,6 +502,8 @@ filter_destroy_walk(gpointer data, gpointer user_data)
  *  everything that has been registered in the gtkTraceSet API.
  */
 static void destroy() {
+  g_slist_foreach(g_filter_list, filter_destroy_walk, NULL );
   
   lttvwindow_unregister_constructor(h_guifilter);
   
@@ -489,14 +522,36 @@ callback_process_button(GtkWidget *widget, gpointer data) {
   g_debug("callback_process_button(): Processing expression");
   
   FilterViewerData *fvd = (FilterViewerData*)data;
+  LttvFilter* filter;
 
   if(strlen(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field))) !=0) {
-    LttvFilter* filter = lttv_filter_new();
+    filter = lttv_filter_new();
     GString* s = g_string_new(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
     lttv_filter_append_expression(filter,s->str);
     g_string_free(s,TRUE);
-    SetFilter(fvd->tab,filter);
+    //SetFilter(fvd->tab,filter);
+  } else {
+    filter = NULL;
   }
+  lttvwindow_report_filter(fvd->tab, filter);
+}
+
+gboolean callback_enter_check(GtkWidget *widget,
+    GdkEventKey *event,
+    gpointer user_data)
+{
+ g_debug("typed : %x", event->keyval);
+ switch(event->keyval) {
+   case GDK_Return:
+   case GDK_KP_Enter:
+   case GDK_ISO_Enter:
+   case GDK_3270_Enter:
+     callback_process_button(widget, user_data);
+     break;
+   default:
+     break;
+ }
+ return FALSE;
 }
 
 /**
This page took 0.025555 seconds and 4 git commands to generate.