return TRUE;
}
+void expand_event(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *arg2, gpointer user_data)
+{
+ ControlFlowData *resourceview_data =
+ (ControlFlowData*)g_object_get_data(
+ G_OBJECT(treeview),
+ "resourceview_data");
+ ProcessList *process_list = (ProcessList *) user_data;
+ ResourceUnique *rup;
+ HashedResourceData *hrd;
+ gboolean result;
+
+ GtkTreeModel *model;
+ GtkTreeIter child;
+
+ /* Determine which trace has been expanded */
+ model = gtk_tree_view_get_model(treeview);
+
+ /* mark each of the trace's resources invisible */
+ result = gtk_tree_model_iter_children(model, &child, iter);
+
+ /* for each child of the collapsed row */
+ while(result) {
+ /* hide the item */
+ gtk_tree_model_get(model, &child, DATA_COLUMN, &hrd, -1);
+ hrd->hidden=0;
+
+ /* find next */
+ result = gtk_tree_model_iter_next(model, &child);
+ }
+
+ update_index_to_pixmap(process_list);
+
+ gtk_widget_queue_draw(resourceview_data->drawing->drawing_area);
+}
+
+void collapse_event(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *arg2, gpointer user_data)
+{
+ ControlFlowData *resourceview_data =
+ (ControlFlowData*)g_object_get_data(
+ G_OBJECT(treeview),
+ "resourceview_data");
+ ProcessList *process_list = (ProcessList *) user_data;
+ ResourceUnique *rup;
+ HashedResourceData *hrd;
+ gboolean result;
+
+ GtkTreeModel *model;
+ GtkTreeIter child;
+
+ /* Determine which trace has been expanded */
+ model = gtk_tree_view_get_model(treeview);
+
+ /* mark each of the trace's resources invisible */
+ result = gtk_tree_model_iter_children(model, &child, iter);
+
+ /* for each child of the collapsed row */
+ while(result) {
+ char *name;
+ /* hide the item */
+ gtk_tree_model_get(model, &child, NAME_COLUMN, &name, DATA_COLUMN, &hrd, -1);
+ hrd->hidden=1;
+
+ /* find next */
+ result = gtk_tree_model_iter_next(model, &child);
+ }
+
+ update_index_to_pixmap(process_list);
+
+ gtk_widget_queue_draw(resourceview_data->drawing->drawing_area);
+}
+
static gboolean update_index_to_pixmap_each (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, UpdateIndexPixmapArg *arg)
{
guint array_index = arg->count;
g_assert(array_index < arg->process_list->index_to_pixmap->len);
- GdkPixmap **pixmap =
- (GdkPixmap**)&g_ptr_array_index(arg->process_list->index_to_pixmap, array_index);
- *pixmap = hdata->pixmap;
+ if(hdata->hidden == 0) {
+ GdkPixmap **pixmap =
+ (GdkPixmap**)&g_ptr_array_index(arg->process_list->index_to_pixmap, array_index);
+ *pixmap = hdata->pixmap;
- arg->count++;
+ arg->count++;
+ }
return FALSE;
}
items += g_hash_table_size(process_list->restypes[i].hash_table);
}
+ /* we don't know the exact number of items there will be,
+ * so set an upper bound */
g_ptr_array_set_size(process_list->index_to_pixmap, items);
arg.count = 0;
gtk_tree_model_foreach(GTK_TREE_MODEL(process_list->list_store),
(GtkTreeModelForeachFunc)update_index_to_pixmap_each, &arg);
+
+ /* now that we know the exact number of items, set it */
+ g_ptr_array_set_size(process_list->index_to_pixmap, arg.count);
}
process_list->process_list_widget =
gtk_tree_view_new_with_model
(GTK_TREE_MODEL (process_list->list_store));
-
- gtk_tree_view_set_show_expanders(
- GTK_TREE_VIEW(process_list->process_list_widget), FALSE);
- gtk_tree_view_set_level_indentation(
- process_list->process_list_widget, 20);
-
- gtk_tree_view_set_enable_tree_lines(process_list->process_list_widget, TRUE);
+ g_object_set(process_list->process_list_widget, "enable-tree-lines", TRUE, NULL);
g_object_unref (G_OBJECT (process_list->list_store));
NULL,
NULL);
+
gtk_tree_sortable_set_sort_column_id(
GTK_TREE_SORTABLE(process_list->list_store),
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
NULL,
NULL,
&process_list->cell_height);
+
+ g_signal_connect(process_list->process_list_widget, "row-expanded", G_CALLBACK(expand_event), process_list);
+ g_signal_connect(process_list->process_list_widget, "row-collapsed", G_CALLBACK(collapse_event), process_list);
#if GTK_CHECK_VERSION(2,4,15)
guint ypad;
process_list->restypes[RV_RESOURCE_MACHINE].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
process_list->restypes[RV_RESOURCE_CPU].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
process_list->restypes[RV_RESOURCE_IRQ].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
+ process_list->restypes[RV_RESOURCE_SOFT_IRQ].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
+ process_list->restypes[RV_RESOURCE_TRAP].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
process_list->restypes[RV_RESOURCE_BDEV].hash_table = g_hash_table_new(ru_numeric_hash_fct, ru_numeric_equ_fct);
-
+
return process_list;
}
return name;
}
+GQuark make_soft_irq_name(ControlFlowData *resourceview_data, guint trace_num, guint id)
+{
+ GQuark name;
+ gchar *str;
+
+ str = g_strdup_printf("SOFTIRQ %u", id);
+ name = g_quark_from_string(str);
+ g_free(str);
+
+ return name;
+}
+
+GQuark make_trap_name(ControlFlowData *resourceview_data, guint trace_num, guint id)
+{
+ GQuark name;
+ gchar *str;
+
+ str = g_strdup_printf("Trap %u", id);
+ name = g_quark_from_string(str);
+ g_free(str);
+
+ return name;
+}
+
GQuark make_bdev_name(ControlFlowData *resourceview_data, guint trace_num, guint id)
{
GQuark name;
data->x.under_used = FALSE;
data->x.under_marked = FALSE;
data->next_good_time = ltt_time_zero;
+ data->hidden = 0;
data->height = resourceview_data->process_list->cell_height;
data->pixmap =
gtk_widget_queue_draw(resourceview_data->drawing->drawing_area);
}
- gtk_tree_view_expand_all(GTK_TREE_VIEW(resourceview_data->process_list->process_list_widget));
+ /* expand the newly added machine */
+ {
+ GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(resourceview_data->process_list->process_list_widget));
+ GtkTreePath *path;
+ path = gtk_tree_model_get_path(model, &data->y_iter);
+
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(resourceview_data->process_list->process_list_widget), path, FALSE);
+
+ gtk_tree_path_free(path);
+ }
return data;
}
HashedResourceData *data = g_new(HashedResourceData, 1);
/* Prepare hash key */
+ ru->ru.type = &(resourceview_data->process_list->restypes[res_type]);
ru->trace_num = trace_num;
ru->id = id;
NAME_COLUMN, g_quark_to_string(name), DATA_COLUMN, data,
-1);
+ /* Determine if we should add it hidden or not */
+ {
+ gboolean result;
+ GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(resourceview_data->process_list->process_list_widget));
+ GtkTreeIter parent_iter;
+
+ result = gtk_tree_model_iter_parent(model, &parent_iter, &data->y_iter);
+ GtkTreePath *path = gtk_tree_model_get_path(model, &parent_iter);
+ data->hidden = gtk_tree_view_row_expanded(GTK_TREE_VIEW(resourceview_data->process_list->process_list_widget), path)?0:1;
+ gtk_tree_path_free(path);
+ }
+
+
update_index_to_pixmap(resourceview_data->process_list);
int heightall = data->height * resourceview_data->process_list->number_of_process;
return resourcelist_obtain_generic(resourceview_data, RV_RESOURCE_IRQ, trace_num, id, make_irq_name);
}
+HashedResourceData *resourcelist_obtain_soft_irq(ControlFlowData *resourceview_data, guint trace_num, guint id)
+{
+ return resourcelist_obtain_generic(resourceview_data, RV_RESOURCE_SOFT_IRQ, trace_num, id, make_soft_irq_name);
+}
+
+HashedResourceData *resourcelist_obtain_trap(ControlFlowData *resourceview_data, guint trace_num, guint id)
+{
+ return resourcelist_obtain_generic(resourceview_data, RV_RESOURCE_TRAP, trace_num, id, make_trap_name);
+}
+
HashedResourceData *resourcelist_obtain_bdev(ControlFlowData *resourceview_data, guint trace_num, guint id)
{
return resourcelist_obtain_generic(resourceview_data, RV_RESOURCE_BDEV, trace_num, id, make_bdev_name);