+}
+
+gint get_cell_height(GtkTreeView *TreeView)
+{
+ gint height, width;
+ GtkTreeViewColumn *Column = gtk_tree_view_get_column(TreeView, 0);
+ GList *Render_List = gtk_tree_view_column_get_cell_renderers(Column);
+ GtkCellRenderer *Renderer = g_list_first(Render_List)->data;
+
+ gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, NULL, &height);
+ g_critical("cell 0 height : %u",height);
+
+ return height;
+}
+
+void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data)
+{
+ EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+ gint Cell_Height = get_cell_height(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
+ gint Last_Num_Visible_Events = Event_Viewer_Data->Num_Visible_Events;
+ gdouble Exact_Num_Visible;
+
+ g_critical("size-allocate");
+
+ Exact_Num_Visible = ( alloc->height -
+ TREE_VIEW_HEADER_HEIGHT (GTK_TREE_VIEW(Event_Viewer_Data->Tree_V)) )
+ / (double)Cell_Height ;
+
+ Event_Viewer_Data->Num_Visible_Events = ceil(Exact_Num_Visible) ;
+
+ g_critical("number of events shown : %u",Event_Viewer_Data->Num_Visible_Events);
+ g_critical("ex number of events shown : %f",Exact_Num_Visible);
+
+ Event_Viewer_Data->VAdjust_C->page_increment =
+ floor(Exact_Num_Visible);
+ Event_Viewer_Data->VAdjust_C->page_size =
+ floor(Exact_Num_Visible);
+
+ if(Event_Viewer_Data->Num_Visible_Events != Last_Num_Visible_Events)
+ {
+ get_test_data((int)Event_Viewer_Data->VAdjust_C->value,
+ Event_Viewer_Data->Num_Visible_Events,
+ Event_Viewer_Data);
+ }
+
+
+}
+
+void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data)
+{
+ gint h;
+ EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+ gint Cell_Height = get_cell_height(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
+
+ g_critical("size-request");
+
+ h = Cell_Height + TREE_VIEW_HEADER_HEIGHT
+ (GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
+ requisition->height = h;
+
+}
+
+void get_test_data(guint Event_Number, guint List_Height,
+ EventViewerData *Event_Viewer_Data)
+{
+ GtkTreeIter iter;
+ int i;
+ GtkTreeModel *model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M);
+ GtkTreePath *Tree_Path;
+ gchar *test_string;
+
+// if(Event_Number > Event_Viewer_Data->Last_Event ||
+// Event_Number + List_Height-1 < Event_Viewer_Data->First_Event ||
+// Event_Viewer_Data->First_Event == -1)
+ {
+ /* no event can be reused, clear and start from nothing */
+ gtk_list_store_clear(Event_Viewer_Data->Store_M);
+ for(i=Event_Number; i<Event_Number+List_Height; i++)
+ {
+ if(i>=Event_Viewer_Data->Number_Of_Events) break;
+ /* Add a new row to the model */
+ gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, 0,
+ EVENT_COLUMN, "event irq",
+ TIME_COLUMN, i,
+ PID_COLUMN, 100,
+ ENTRY_LEN_COLUMN, 17,
+ EVENT_DESCR_COLUMN, "Detailed information",
+ -1);
+ }
+ }
+#ifdef DEBUG //do not use this, it's slower and broken
+// } else {
+ /* Some events will be reused */
+ if(Event_Number < Event_Viewer_Data->First_Event)
+ {
+ /* scrolling up, prepend events */
+ Tree_Path = gtk_tree_path_new_from_indices
+ (Event_Number+List_Height-1 -
+ Event_Viewer_Data->First_Event + 1,
+ -1);
+ for(i=0; i<Event_Viewer_Data->Last_Event-(Event_Number+List_Height-1);
+ i++)
+ {
+ /* Remove the last events from the list */
+ if(gtk_tree_model_get_iter(model, &iter, Tree_Path))
+ gtk_list_store_remove(Event_Viewer_Data->Store_M, &iter);
+ }
+
+ for(i=Event_Viewer_Data->First_Event-1; i>=Event_Number; i--)
+ {
+ if(i>=Event_Viewer_Data->Number_Of_Events) break;
+ /* Prepend new events */
+ gtk_list_store_prepend (Event_Viewer_Data->Store_M, &iter);
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, 0,
+ EVENT_COLUMN, "event irq",
+ TIME_COLUMN, i,
+ PID_COLUMN, 100,
+ ENTRY_LEN_COLUMN, 17,
+ EVENT_DESCR_COLUMN, "Detailed information",
+ -1);
+ }
+ } else {
+ /* Scrolling down, append events */
+ for(i=Event_Viewer_Data->First_Event; i<Event_Number; i++)
+ {
+ /* Remove these events from the list */
+ gtk_tree_model_get_iter_first(model, &iter);
+ gtk_list_store_remove(Event_Viewer_Data->Store_M, &iter);
+ }
+ for(i=Event_Viewer_Data->Last_Event+1; i<Event_Number+List_Height; i++)
+ {
+ if(i>=Event_Viewer_Data->Number_Of_Events) break;
+ /* Append new events */
+ gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, 0,
+ EVENT_COLUMN, "event irq",
+ TIME_COLUMN, i,
+ PID_COLUMN, 100,
+ ENTRY_LEN_COLUMN, 17,
+ EVENT_DESCR_COLUMN, "Detailed information",
+ -1);
+ }
+
+ }
+ }
+#endif //DEBUG
+ Event_Viewer_Data->First_Event = Event_Number ;
+ Event_Viewer_Data->Last_Event = Event_Number+List_Height-1 ;
+
+
+
+}
+
+
+void add_test_data(EventViewerData *Event_Viewer_Data)
+{
+ GtkTreeIter iter;
+ int i;
+
+ for(i=0; i<10; i++)
+ {
+ /* Add a new row to the model */
+ gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, 0,
+ EVENT_COLUMN, "event irq",
+ TIME_COLUMN, i,
+ PID_COLUMN, 100,
+ ENTRY_LEN_COLUMN, 17,
+ EVENT_DESCR_COLUMN, "Detailed information",
+ -1);
+ }
+
+}
+
+
+void
+GuiEvents_Destructor(EventViewerData *Event_Viewer_Data)
+{
+ guint index;
+
+ /* May already been done by GTK window closing */
+ if(GTK_IS_WIDGET(Event_Viewer_Data->HBox_V))
+ gtk_widget_destroy(Event_Viewer_Data->HBox_V);
+
+ /* Destroy the Tree View */
+ //gtk_widget_destroy(Event_Viewer_Data->Tree_V);
+
+ /* Clear raw event list */
+ //gtk_list_store_clear(Event_Viewer_Data->Store_M);
+ //gtk_widget_destroy(GTK_WIDGET(Event_Viewer_Data->Store_M));
+
+ g_slist_remove(sEvent_Viewer_Data_List,Event_Viewer_Data);
+}
+
+//FIXME : call hGuiEvents_Destructor for corresponding data upon widget destroy
+
+static void
+tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
+{
+ EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M);
+ gchar *Event;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_tree_model_get (model, &iter, EVENT_COLUMN, &Event, -1);
+
+ g_print ("Event selected : %s\n", Event);
+
+ g_free (Event);
+ }
+}
+
+
+
+int Event_Selected_Hook(void *hook_data, void *call_data)
+{
+ EventViewerData *Event_Viewer_Data = (EventViewerData*) hook_data;
+ guint *Event_Number = (guint*) call_data;
+
+ g_critical("DEBUG : event selected by main window : %u", *Event_Number);
+
+ Event_Viewer_Data->Currently_Selected_Event = *Event_Number;
+ Event_Viewer_Data->Selected_Event = TRUE ;
+
+ Tree_V_set_cursor(Event_Viewer_Data);
+
+}
+
+
+
+
+
+
+
+/* Imported code from LTT 0.9.6pre2 tracevisualizer */
+#ifdef DEBUG
+