* 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>
#include "hGuiFilterInsert.xpm"
+
+GSList *g_filter_list = NULL ;
+
/*! \file lttv/modules/gui/filter/filter.c
* \brief Graphic filter interface.
*
* expression text entry or add simple expressions using the
* many choices boxes.
*
- * NOTE:
- * The version of gtk-2.0 currently installed on
+ * \note The version of gtk-2.0 currently installed on
* my desktop misses some function of the newer
- * gtk+ api.
- *
- * For the time being, I'll use the older api
+ * gtk+ api. For the time being, I'll use the older api
* to keep compatibility with most systems.
*/
FilterViewerDataLine* gui_filter_add_line(FilterViewerData *fvd);
void gui_filter_line_set_visible(FilterViewerDataLine *fvdl, gboolean v);
void gui_filter_line_reset(FilterViewerDataLine *fvdl);
-gboolean filter_traceset_changed(void * hook_data, void * call_data);
-gboolean filter_viewer_data(void * hook_data, void * call_data);
GtkWidget* h_guifilter(Tab *tab);
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);
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) */
GPtrArray *f_math_op_options; /**< array of operators types for math_op box */
GtkWidget *f_add_button; /**< add expression to current expression (GtkButton) */
-
+
};
/**
GtkWidget*
guifilter_get_widget(FilterViewerData *fvd)
{
- return fvd->f_main_box;
+ return fvd->f_window;
}
/**
FilterViewerData*
gui_filter(Tab *tab)
{
- g_print("filter::gui_filter()");
+ g_debug("filter::gui_filter()");
unsigned i;
GtkCellRenderer *renderer;
fvd->tab = tab;
- lttvwindow_register_traceset_notify(fvd->tab,
- filter_traceset_changed,
- filter_viewer_data);
+// lttvwindow_register_traceset_notify(fvd->tab,
+// filter_traceset_changed,
+// filter_viewer_data);
// request_background_data(filter_viewer_data);
/*
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"));
*/
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"));
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
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);
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;
* show main container
*/
gtk_widget_show(fvd->f_main_box);
+ gtk_widget_show(fvd->f_window);
g_object_set_data_full(
fvd,
(GDestroyNotify)gui_filter_destructor);
+ g_filter_list = g_slist_append(
+ g_filter_list,
+ fvd);
return fvd;
}
gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_not_op_box),0);
gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_field_box),0);
gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_math_op_box),0);
- gtk_entry_set_text(GTK_COMBO_BOX(fvdl->f_value_field),"");
+ gtk_entry_set_text(GTK_ENTRY(fvdl->f_value_field),"");
gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_logical_op_box),0);
}
if(GTK_IS_WIDGET(guifilter_get_widget(fvd))){
g_info("widget still exists");
}
- if(tab != NULL) {
- lttvwindow_unregister_traceset_notify(fvd->tab,
- filter_traceset_changed,
- filter_viewer_data);
- }
+// if(tab != NULL) {
+// lttvwindow_unregister_traceset_notify(fvd->tab,
+// filter_traceset_changed,
+// filter_viewer_data);
+// }
lttvwindowtraces_background_notify_remove(fvd);
-
+
+ g_filter_list = g_slist_remove(g_filter_list, fvd);
+
g_free(fvd);
}
-/**
- * @fn gboolean filter_traceset_changed(void*,void*)
- *
- * Hook function
- * @param hook_data The hook data
- * @param call_data The call data
- * @return Success/Failure of operation
- */
-gboolean
-filter_traceset_changed(void * hook_data, void * call_data) {
-
- return FALSE;
-}
-
-/**
- * @fn gboolean filter_viewer_data(void*,void*)
- *
- * Hook function
- * @param hook_data The hook data
- * @param call_data The call data
- * @return Success/Failure of operation
- */
-gboolean
-filter_viewer_data(void * hook_data, void * call_data) {
-
- return FALSE;
-}
/**
* @fn GtkWidget* h_guifilter(Tab*)
{
FilterViewerData* f = gui_filter(tab) ;
- g_print("FilterViewerData:%p\n",f);
- if(f)
- return guifilter_get_widget(f);
- else return NULL;
-
+ return NULL;
}
/**
FilterViewerData *fvd = (FilterViewerData*)data;
g_debug("CFV.c : filter_destroy_walk, %p", fvd);
+
/* May already have been done by GTK window closing */
if(GTK_IS_WIDGET(guifilter_get_widget(fvd)))
gtk_widget_destroy(guifilter_get_widget(fvd));
* 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);
void
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();
- lttv_filter_append_expression(filter,gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
- SetFilter(fvd->tab,filter);
+ 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);
+ } 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;
}
/**
*/
void
callback_expression_field(GtkWidget *widget, gpointer data) {
-
+
FilterViewerData *fvd = (FilterViewerData*)data;
if(strlen(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field))) !=0) {
void
callback_add_button(GtkWidget *widget, gpointer data) {
- g_print("filter::callback_add_button()\n");
+ g_debug("callback_add_button(): processing simple expressions");
+ unsigned i;
+
FilterViewerData *fvd = (FilterViewerData*)data;
FilterViewerDataLine *fvdl = NULL;
GString* a_filter_string = g_string_new("");
+ /*
+ * adding linking operator to
+ * string
+ */
GString* s;
s = g_ptr_array_index(fvd->f_logical_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvd->f_logical_op_junction_box)));
- g_print("s:%p\n",s);
- g_print("string:%s\n",s);
- g_string_append(a_filter_string,s->str);
- gtk_combo_box_set_active(fvd->f_logical_op_junction_box,0);
+ a_filter_string = g_string_append(a_filter_string,s->str);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(fvd->f_logical_op_junction_box),0);
- g_print("passe junction\n");
-
- g_string_append_c(a_filter_string,'(');
+ /* begin expression */
+ a_filter_string = g_string_append_c(a_filter_string,'(');
- int i;
+ /*
+ * For each simple expression, add the resulting string
+ * to the filter string
+ *
+ * Each simple expression takes the following schema
+ * [not operator '!',' '] [field type] [math operator '<','<=','>','>=','=','!='] [value]
+ */
for(i=0;i<fvd->f_lines->len;i++) {
fvdl = (FilterViewerDataLine*)g_ptr_array_index(fvd->f_lines,i);
s = g_ptr_array_index(fvd->f_not_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_not_op_box)));
- g_string_append(a_filter_string,s->str);
+ a_filter_string = g_string_append(a_filter_string,s->str);
s = g_ptr_array_index(fvd->f_field_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_field_box)));
- g_string_append(a_filter_string,s->str);
+ a_filter_string = g_string_append(a_filter_string,s->str);
s = g_ptr_array_index(fvd->f_math_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_math_op_box)));
- g_string_append(a_filter_string,s->str);
+ a_filter_string = g_string_append(a_filter_string,s->str);
- g_string_append(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvdl->f_value_field)));
+ a_filter_string = g_string_append(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvdl->f_value_field)));
s = g_ptr_array_index(fvd->f_logical_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_logical_op_box)));
- g_string_append(a_filter_string,s->str);
+ a_filter_string = g_string_append(a_filter_string,s->str);
+ /*
+ * resetting simple expression lines
+ */
gui_filter_line_reset(fvdl);
if(i) gui_filter_line_set_visible(fvdl,FALSE); // Only keep the first line
}
- g_string_append_c(a_filter_string,')');
+ /* end expression */
+ a_filter_string = g_string_append_c(a_filter_string,')');
g_string_prepend(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
gtk_entry_set_text(GTK_ENTRY(fvd->f_expression_field),a_filter_string->str);
void
callback_logical_op_box(GtkWidget *widget, gpointer data) {
- g_print("filter::callback_logical_op_box()\n");
+ g_debug("callback_logical_op_box(): adding new simple expression");
FilterViewerData *fvd = (FilterViewerData*)data;
FilterViewerDataLine *fvdl = NULL;
for(i=0;i<fvd->f_lines->len;i++) {
fvdl = (FilterViewerDataLine*)g_ptr_array_index(fvd->f_lines,i);
if(fvdl->f_logical_op_box == widget) {
- if(gtk_combo_box_get_active(fvdl->f_logical_op_box) == 0) return;
+ if(gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_logical_op_box)) == 0) return;
if(i==fvd->f_lines->len-1) { /* create a new line */
fvd->rows++;
FilterViewerDataLine* fvdl2 = gui_filter_add_line(fvd);