X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Fcfv.c;h=f7a25827efbad088cfbfaf0db8b77729b69f5d77;hb=2dd5f7c525c94774d24360dc8f7dbbc015127568;hp=3d4f7af407221668f88ab50b5146016e774f453a;hpb=ce0214a66f4e1c6f4d94d53c1ead65b58157c60d;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/cfv.c b/ltt/branches/poly/lttv/modules/gui/controlflow/cfv.c index 3d4f7af4..f7a25827 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/cfv.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/cfv.c @@ -16,21 +16,110 @@ * MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include +#include +#include +#include +#include #include "cfv.h" #include "drawing.h" #include "processlist.h" #include "eventhooks.h" -#include "cfv-private.h" +#include "lttv_plugin_cfv.h" +extern GSList *g_control_flow_data_list; + +static gboolean +header_size_allocate(GtkWidget *widget, + GtkAllocation *allocation, + gpointer user_data) +{ + Drawing_t *drawing = (Drawing_t*)user_data; + + gtk_widget_set_size_request(drawing->ruler, -1, allocation->height); + //gtk_widget_queue_resize(drawing->padding); + //gtk_widget_queue_resize(drawing->ruler); + gtk_container_check_resize(GTK_CONTAINER(drawing->ruler_hbox)); + return 0; +} + +gboolean cfv_scroll_event(GtkWidget *widget, GdkEventScroll *event, + gpointer data) +{ + ControlFlowData *control_flow_data = (ControlFlowData*)data; + unsigned int cell_height = + get_cell_height( + GTK_TREE_VIEW(control_flow_data->process_list->process_list_widget)); + gdouble new; + + switch(event->direction) { + case GDK_SCROLL_UP: + { + new = gtk_adjustment_get_value(control_flow_data->v_adjust) + - cell_height; + } + break; + case GDK_SCROLL_DOWN: + { + new = gtk_adjustment_get_value(control_flow_data->v_adjust) + + cell_height; + } + break; + default: + return FALSE; + } + if(new >= control_flow_data->v_adjust->lower && + new <= control_flow_data->v_adjust->upper + - control_flow_data->v_adjust->page_size) + gtk_adjustment_set_value(control_flow_data->v_adjust, new); + return TRUE; +} + + +/* Toolbar callbacks */ +static void property_button (GtkToolButton *toolbutton, + gpointer user_data) +{ + ControlFlowData *control_flow_data = (ControlFlowData*)user_data; + + g_printf("CFV Property button clicked\n"); + +} + +/* Toolbar callbacks */ +static void filter_button (GtkToolButton *toolbutton, + gpointer user_data) +{ + LttvPluginCFV *plugin_cfv = (LttvPluginCFV*)user_data; + LttvAttribute *attribute; + LttvAttributeValue value; + gboolean ret; + g_printf("Filter button clicked\n"); + + attribute = LTTV_ATTRIBUTE(lttv_iattribute_find_subdir( + LTTV_IATTRIBUTE(lttv_global_attributes()), + LTTV_VIEWER_CONSTRUCTORS)); + g_assert(attribute); + + ret = lttv_iattribute_find_by_path(LTTV_IATTRIBUTE(attribute), + "guifilter", LTTV_POINTER, &value); + g_assert(ret); + lttvwindow_viewer_constructor constructor = + (lttvwindow_viewer_constructor)*(value.v_pointer); + if(constructor) constructor(&plugin_cfv->parent); + else g_warning("Filter module not loaded."); + + //FIXME : viewer returned. +} -#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) -extern GSList *g_control_flow_data_list; /***************************************************************************** * Control Flow Viewer class implementation * @@ -44,11 +133,25 @@ extern GSList *g_control_flow_data_list; * @return The widget created. */ ControlFlowData * -guicontrolflow(void) +guicontrolflow(LttvPluginTab *ptab) { - GtkWidget *process_list_widget, *drawing_widget; + Tab *tab = ptab->tab; + GtkWidget *tmp_toolbar_icon; + GtkWidget *process_list_widget, *drawing_widget, *drawing_area; + //ControlFlowData* control_flow_data = g_new(ControlFlowData,1) ; + LttvPluginCFV *plugin_cfv = g_object_new(LTTV_TYPE_PLUGIN_CFV, NULL); + GtkTooltips *tooltips = gtk_tooltips_new(); + ControlFlowData* control_flow_data = plugin_cfv->cfd; + control_flow_data->ptab = ptab; + control_flow_data->tab = ptab->tab; - ControlFlowData* control_flow_data = g_new(ControlFlowData,1) ; + control_flow_data->v_adjust = + GTK_ADJUSTMENT(gtk_adjustment_new( 0.0, /* Value */ + 0.0, /* Lower */ + 0.0, /* Upper */ + 0.0, /* Step inc. */ + 0.0, /* Page inc. */ + 0.0)); /* page size */ /* Create the drawing */ control_flow_data->drawing = drawing_construct(control_flow_data); @@ -56,7 +159,11 @@ guicontrolflow(void) drawing_widget = drawing_get_widget(control_flow_data->drawing); + drawing_area = + drawing_get_drawing_area(control_flow_data->drawing); + control_flow_data->number_of_process = 0; + control_flow_data->background_info_waiting = 0; /* Create the Process list */ control_flow_data->process_list = processlist_construct(); @@ -64,32 +171,87 @@ guicontrolflow(void) process_list_widget = processlist_get_widget(control_flow_data->process_list); - //control_flow_data->Inside_HBox_V = gtk_hbox_new(0, 0); - control_flow_data->h_paned = gtk_hpaned_new(); - - gtk_paned_pack1(GTK_PANED(control_flow_data->h_paned), process_list_widget, FALSE, TRUE); - gtk_paned_pack2(GTK_PANED(control_flow_data->h_paned), drawing_widget, TRUE, TRUE); + gtk_tree_view_set_vadjustment(GTK_TREE_VIEW(process_list_widget), + GTK_ADJUSTMENT( + control_flow_data->v_adjust)); - control_flow_data->v_adjust = - GTK_ADJUSTMENT(gtk_adjustment_new( 0.0, /* Value */ - 0.0, /* Lower */ - 0.0, /* Upper */ - 0.0, /* Step inc. */ - 0.0, /* Page inc. */ - 0.0)); /* page size */ + g_signal_connect (G_OBJECT(process_list_widget), + "scroll-event", + G_CALLBACK (cfv_scroll_event), + (gpointer)control_flow_data); + g_signal_connect (G_OBJECT(drawing_area), + "scroll-event", + G_CALLBACK (cfv_scroll_event), + (gpointer)control_flow_data); - control_flow_data->scrolled_window = - gtk_scrolled_window_new (NULL, - control_flow_data->v_adjust); + g_signal_connect (G_OBJECT(control_flow_data->process_list->button), + "size-allocate", + G_CALLBACK(header_size_allocate), + (gpointer)control_flow_data->drawing); +#if 0 /* not ready */ + g_signal_connect ( + // G_OBJECT(control_flow_data->process_list->process_list_widget), + G_OBJECT(control_flow_data->process_list->list_store), + "row-changed", + G_CALLBACK (tree_row_activated), + (gpointer)control_flow_data); +#endif //0 - gtk_scrolled_window_set_policy( - GTK_SCROLLED_WINDOW(control_flow_data->scrolled_window) , - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - - gtk_scrolled_window_add_with_viewport( - GTK_SCROLLED_WINDOW(control_flow_data->scrolled_window), - control_flow_data->h_paned); + control_flow_data->hbox = gtk_hbox_new(FALSE, 1); + control_flow_data->toolbar = gtk_toolbar_new(); + gtk_toolbar_set_orientation(GTK_TOOLBAR(control_flow_data->toolbar), + GTK_ORIENTATION_VERTICAL); + + tmp_toolbar_icon = create_pixmap (main_window_get_widget(tab), + "guifilter16x16.png"); + gtk_widget_show(tmp_toolbar_icon); + control_flow_data->button_filter = gtk_tool_button_new(tmp_toolbar_icon, + "Filter"); + g_signal_connect (G_OBJECT(control_flow_data->button_filter), + "clicked", + G_CALLBACK (filter_button), + (gpointer)plugin_cfv); + gtk_toolbar_insert(GTK_TOOLBAR(control_flow_data->toolbar), + control_flow_data->button_filter, + 0); + gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(control_flow_data->button_filter), + tooltips, "Open the filter window", NULL); + + tmp_toolbar_icon = create_pixmap (main_window_get_widget(tab), + "properties.png"); + gtk_widget_show(tmp_toolbar_icon); + control_flow_data->button_prop = gtk_tool_button_new(tmp_toolbar_icon, + "Properties"); + g_signal_connect (G_OBJECT(control_flow_data->button_prop), + "clicked", + G_CALLBACK (property_button), + (gpointer)control_flow_data); + gtk_toolbar_insert(GTK_TOOLBAR(control_flow_data->toolbar), + control_flow_data->button_prop, + 1); + + gtk_toolbar_set_style(GTK_TOOLBAR(control_flow_data->toolbar), + GTK_TOOLBAR_ICONS); + + gtk_box_pack_start(GTK_BOX(control_flow_data->hbox), + control_flow_data->toolbar, + FALSE, FALSE, 0); + control_flow_data->h_paned = gtk_hpaned_new(); + control_flow_data->box = gtk_event_box_new(); + gtk_box_pack_end(GTK_BOX(control_flow_data->hbox), + control_flow_data->box, + TRUE, TRUE, 0); + control_flow_data->top_widget = control_flow_data->hbox; + plugin_cfv->parent.top_widget = control_flow_data->top_widget; + gtk_container_add(GTK_CONTAINER(control_flow_data->box), + control_flow_data->h_paned); + + gtk_paned_pack1(GTK_PANED(control_flow_data->h_paned), + process_list_widget, FALSE, TRUE); + gtk_paned_pack2(GTK_PANED(control_flow_data->h_paned), + drawing_widget, TRUE, TRUE); + + gtk_container_set_border_width(GTK_CONTAINER(control_flow_data->box), 1); /* Set the size of the drawing area */ //drawing_Resize(drawing, h, w); @@ -97,94 +259,101 @@ guicontrolflow(void) /* Get trace statistics */ //control_flow_data->Trace_Statistics = get_trace_statistics(Trace); - gtk_widget_show(drawing_widget); gtk_widget_show(process_list_widget); gtk_widget_show(control_flow_data->h_paned); - gtk_widget_show(control_flow_data->scrolled_window); + gtk_widget_show(control_flow_data->box); + gtk_widget_show(control_flow_data->toolbar); + gtk_widget_show(GTK_WIDGET(control_flow_data->button_prop)); + gtk_widget_show(GTK_WIDGET(control_flow_data->button_filter)); + gtk_widget_show(control_flow_data->hbox); g_object_set_data_full( - G_OBJECT(control_flow_data->scrolled_window), - "control_flow_data", - control_flow_data, + G_OBJECT(control_flow_data->top_widget), + "plugin_data", + plugin_cfv, (GDestroyNotify)guicontrolflow_destructor); g_object_set_data( - G_OBJECT(drawing_widget), + G_OBJECT(drawing_area), "control_flow_data", control_flow_data); g_control_flow_data_list = g_slist_append( g_control_flow_data_list, - control_flow_data); + plugin_cfv); + + control_flow_data->filter = NULL; //WARNING : The widget must be //inserted in the main window before the drawing area //can be configured (and this must happend bedore sending //data) - + return control_flow_data; } /* Destroys widget also */ void -guicontrolflow_destructor_full(ControlFlowData *control_flow_data) +guicontrolflow_destructor_full(gpointer data) { - g_info("CFV.c : guicontrolflow_destructor_full, %p", control_flow_data); + LttvPluginCFV *plugin_cfv = (LttvPluginCFV*)data; + g_info("CFV.c : guicontrolflow_destructor_full, %p", plugin_cfv); /* May already have been done by GTK window closing */ - if(GTK_IS_WIDGET(control_flow_data->scrolled_window)) - gtk_widget_destroy(control_flow_data->scrolled_window); + if(GTK_IS_WIDGET(guicontrolflow_get_widget(plugin_cfv->cfd))) + gtk_widget_destroy(guicontrolflow_get_widget(plugin_cfv->cfd)); //control_flow_data->mw = NULL; //FIXME guicontrolflow_destructor(control_flow_data); } /* When this destructor is called, the widgets are already disconnected */ void -guicontrolflow_destructor(ControlFlowData *control_flow_data) +guicontrolflow_destructor(gpointer data) { - guint index; + LttvPluginCFV *plugin_cfv = (LttvPluginCFV*)data; + Tab *tab = plugin_cfv->cfd->tab; + ControlFlowData *control_flow_data = plugin_cfv->cfd; - g_info("CFV.c : guicontrolflow_destructor, %p", control_flow_data); - g_info("%p, %p, %p", update_time_window_hook, control_flow_data, control_flow_data->mw); - if(GTK_IS_WIDGET(control_flow_data->scrolled_window)) + g_info("CFV.c : guicontrolflow_destructor, %p", plugin_cfv); + g_info("%p, %p, %p", update_time_window_hook, plugin_cfv, tab); + if(GTK_IS_WIDGET(guicontrolflow_get_widget(plugin_cfv->cfd))) g_info("widget still exists"); + lttv_filter_destroy(plugin_cfv->cfd->filter); /* Process List is removed with it's widget */ //ProcessList_destroy(control_flow_data->process_list); - if(control_flow_data->mw != NULL) + if(tab != NULL) { - unreg_update_time_window(update_time_window_hook, - control_flow_data, - control_flow_data->mw); + /* Delete reading hooks */ + lttvwindow_unregister_traceset_notify(tab, + traceset_notify, + control_flow_data); + + lttvwindow_unregister_time_window_notify(tab, + update_time_window_hook, + control_flow_data); - unreg_update_current_time(update_current_time_hook, - control_flow_data, - control_flow_data->mw); - } - g_info("CFV.c : guicontrolflow_destructor, %p", control_flow_data); - g_slist_remove(g_control_flow_data_list,control_flow_data); - g_free(control_flow_data); -} + lttvwindow_unregister_current_time_notify(tab, + update_current_time_hook, + control_flow_data); -GtkWidget *guicontrolflow_get_widget(ControlFlowData *control_flow_data) -{ - return control_flow_data->scrolled_window ; -} + lttvwindow_unregister_redraw_notify(tab, redraw_notify, control_flow_data); + lttvwindow_unregister_continue_notify(tab, + continue_notify, + control_flow_data); + + lttvwindow_events_request_remove_all(control_flow_data->tab, + control_flow_data); -ProcessList *guicontrolflow_get_process_list - (ControlFlowData *control_flow_data) -{ - return control_flow_data->process_list ; -} + } + lttvwindowtraces_background_notify_remove(control_flow_data); + g_control_flow_data_list = + g_slist_remove(g_control_flow_data_list, control_flow_data); -TimeWindow *guicontrolflow_get_time_window(ControlFlowData *control_flow_data) -{ - return &control_flow_data->time_window; -} -LttTime *guicontrolflow_get_current_time(ControlFlowData *control_flow_data) -{ - return &control_flow_data->current_time; + g_info("CFV.c : guicontrolflow_destructor end, %p", control_flow_data); + //g_free(control_flow_data); + g_object_unref(plugin_cfv); }