mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 08:00:53 +00:00
Eliminate as many signal emissions as we can from footreestore.c
This commit is contained in:
@ -233,6 +233,11 @@ foo_tree_store_init (FooTreeStore *tree_store)
|
|||||||
tree_store->sort_list = NULL;
|
tree_store->sort_list = NULL;
|
||||||
tree_store->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
|
tree_store->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
|
||||||
tree_store->columns_dirty = FALSE;
|
tree_store->columns_dirty = FALSE;
|
||||||
|
|
||||||
|
tree_store->row_changed_id = g_signal_lookup ("row_changed", GTK_TYPE_TREE_MODEL);
|
||||||
|
tree_store->row_inserted_id = g_signal_lookup ("row_inserted", GTK_TYPE_TREE_MODEL);
|
||||||
|
tree_store->row_has_child_toggled_id = g_signal_lookup ("row_has_child_toggled", GTK_TYPE_TREE_MODEL);
|
||||||
|
tree_store->rows_reordered_id = g_signal_lookup ("rows_reordered", GTK_TYPE_TREE_MODEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1059,11 +1064,13 @@ foo_tree_store_set_valist (FooTreeStore *tree_store,
|
|||||||
|
|
||||||
if (emit_signal)
|
if (emit_signal)
|
||||||
{
|
{
|
||||||
GtkTreePath *path;
|
if (g_signal_has_handler_pending (tree_store, tree_store->row_changed_id, 0, FALSE))
|
||||||
|
{
|
||||||
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
|
GtkTreePath *path;
|
||||||
gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter);
|
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter);
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1182,7 +1189,6 @@ foo_tree_store_insert (FooTreeStore *tree_store,
|
|||||||
GtkTreeIter *parent,
|
GtkTreeIter *parent,
|
||||||
gint position)
|
gint position)
|
||||||
{
|
{
|
||||||
GtkTreePath *path;
|
|
||||||
GNode *parent_node;
|
GNode *parent_node;
|
||||||
GNode *new_node;
|
GNode *new_node;
|
||||||
|
|
||||||
@ -1204,20 +1210,26 @@ foo_tree_store_insert (FooTreeStore *tree_store,
|
|||||||
iter->user_data = new_node;
|
iter->user_data = new_node;
|
||||||
g_node_insert (parent_node, position, new_node);
|
g_node_insert (parent_node, position, new_node);
|
||||||
|
|
||||||
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
|
if (g_signal_has_handler_pending (tree_store, tree_store->row_inserted_id, 0, FALSE) ||
|
||||||
gtk_tree_model_row_inserted (GTK_TREE_MODEL (tree_store), path, iter);
|
g_signal_has_handler_pending (tree_store, tree_store->row_has_child_toggled_id, 0, FALSE))
|
||||||
|
|
||||||
if (parent_node != tree_store->root)
|
|
||||||
{
|
{
|
||||||
if (new_node->prev == NULL && new_node->next == NULL)
|
GtkTreePath *path;
|
||||||
{
|
|
||||||
gtk_tree_path_up (path);
|
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
|
||||||
gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (tree_store), path, parent);
|
gtk_tree_model_row_inserted (GTK_TREE_MODEL (tree_store), path, iter);
|
||||||
}
|
|
||||||
|
if (parent_node != tree_store->root)
|
||||||
|
{
|
||||||
|
if (new_node->prev == NULL && new_node->next == NULL)
|
||||||
|
{
|
||||||
|
gtk_tree_path_up (path);
|
||||||
|
gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (tree_store), path, parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_tree_path_free (path);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_tree_path_free (path);
|
|
||||||
|
|
||||||
validate_tree ((FooTreeStore*)tree_store);
|
validate_tree ((FooTreeStore*)tree_store);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2850,10 +2862,15 @@ foo_tree_store_sort_helper (FooTreeStore *tree_store,
|
|||||||
|
|
||||||
iter.stamp = tree_store->stamp;
|
iter.stamp = tree_store->stamp;
|
||||||
iter.user_data = parent;
|
iter.user_data = parent;
|
||||||
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), &iter);
|
|
||||||
gtk_tree_model_rows_reordered (GTK_TREE_MODEL (tree_store),
|
if (g_signal_has_handler_pending (tree_store, tree_store->row_inserted_id, 0, FALSE))
|
||||||
path, &iter, new_order);
|
{
|
||||||
gtk_tree_path_free (path);
|
path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), &iter);
|
||||||
|
gtk_tree_model_rows_reordered (GTK_TREE_MODEL (tree_store),
|
||||||
|
path, &iter, new_order);
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (new_order);
|
g_free (new_order);
|
||||||
g_array_free (sort_array, TRUE);
|
g_array_free (sort_array, TRUE);
|
||||||
|
|
||||||
|
|||||||
@ -56,6 +56,12 @@ struct _FooTreeStore
|
|||||||
GtkTreeIterCompareFunc GSEAL (default_sort_func);
|
GtkTreeIterCompareFunc GSEAL (default_sort_func);
|
||||||
gpointer GSEAL (default_sort_data);
|
gpointer GSEAL (default_sort_data);
|
||||||
GDestroyNotify GSEAL (default_sort_destroy);
|
GDestroyNotify GSEAL (default_sort_destroy);
|
||||||
|
|
||||||
|
guint row_changed_id;
|
||||||
|
guint row_inserted_id;
|
||||||
|
guint row_has_child_toggled_id;
|
||||||
|
guint rows_reordered_id;
|
||||||
|
|
||||||
guint GSEAL (columns_dirty) : 1;
|
guint GSEAL (columns_dirty) : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -256,26 +256,32 @@ tree_view_set_model_with_default_sort (GtkTreeView *view,
|
|||||||
int model_column,
|
int model_column,
|
||||||
GtkSortType default_sort)
|
GtkSortType default_sort)
|
||||||
{
|
{
|
||||||
gboolean was_sorted = FALSE;
|
int column;
|
||||||
int old_column;
|
GtkSortType type;
|
||||||
GtkSortType old_type;
|
|
||||||
GtkTreeSortable *old_model;
|
GtkTreeSortable *old_model;
|
||||||
GtkAdjustment *adjustment;
|
GtkAdjustment *adjustment;
|
||||||
|
|
||||||
old_model = GTK_TREE_SORTABLE (gtk_tree_view_get_model (view));
|
old_model = GTK_TREE_SORTABLE (gtk_tree_view_get_model (view));
|
||||||
|
|
||||||
if (old_model)
|
if (!(old_model && gtk_tree_sortable_get_sort_column_id (
|
||||||
|
GTK_TREE_SORTABLE (old_model), &column, &type)))
|
||||||
{
|
{
|
||||||
was_sorted = gtk_tree_sortable_get_sort_column_id (
|
column = model_column;
|
||||||
GTK_TREE_SORTABLE (old_model), &old_column, &old_type);
|
type = default_sort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Setting the sort column here prevents the "rows_reordered"
|
||||||
|
* signal from being emitted when the model is attached to
|
||||||
|
* a treeview. This is desirable because at that point there
|
||||||
|
* is a handler attached, which means the signal will actually
|
||||||
|
* be emitted.
|
||||||
|
*/
|
||||||
|
gtk_tree_sortable_set_sort_column_id (
|
||||||
|
GTK_TREE_SORTABLE (model), column, type);
|
||||||
|
|
||||||
gtk_tree_view_set_model (view, model);
|
gtk_tree_view_set_model (view, model);
|
||||||
|
|
||||||
if (was_sorted)
|
tree_view_set_sort_column (view, column, type);
|
||||||
tree_view_set_sort_column (view, old_column, old_type);
|
|
||||||
else
|
|
||||||
tree_view_set_sort_column (view, model_column, default_sort);
|
|
||||||
|
|
||||||
/* Workaround for GTK+ crack, see bug 405625 */
|
/* Workaround for GTK+ crack, see bug 405625 */
|
||||||
adjustment = gtk_tree_view_get_vadjustment (view);
|
adjustment = gtk_tree_view_get_vadjustment (view);
|
||||||
|
|||||||
Reference in New Issue
Block a user