#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.
*
* 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->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;
}
// filter_viewer_data);
// }
lttvwindowtraces_background_notify_remove(fvd);
-
+
+ g_filter_list = g_slist_remove(g_filter_list, fvd);
+
g_free(fvd);
}
{
FilterViewerData* f = gui_filter(tab) ;
- if(f)
- return guifilter_get_widget(f);
- else return NULL;
-
+ return NULL;
}
/**
* 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);
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);
- lttvwindow_report_filter(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;
}
/**