void list_clear_digests(void) { GtkTreeIter iter; if (!gtk_tree_model_get_iter_first(gui.treemodel, &iter)) return; int cols_n = 0; for (int i = 0; i < HASH_FUNCS_N; i++) if (hash.funcs[i].supported) cols_n++; gint cols[cols_n]; GValue vals[HASH_FUNCS_N] = { G_VALUE_INIT }; for (int i = 0; i < cols_n; i++) { cols[i] = COL_DIGESTS + i; g_value_init(&vals[i], G_TYPE_STRING); } do { gtk_list_store_set_valuesv(gui.liststore, &iter, cols, vals, cols_n); } while (gtk_tree_model_iter_next(gui.treemodel, &iter)); }
static VALUE lstore_set_valuesv(VALUE self, VALUE iter, VALUE values) { GValue *g_values; GtkListStore *store; GtkTreeModel *model; gint *g_columns; gint i, length; length = NUM2INT(rb_funcall(values, id_size, 0)); if (length == 0) return self; g_columns = ALLOCA_N(gint, length); g_values = ALLOCA_N(GValue, length); MEMZERO(g_values, GValue, length); G_CHILD_ADD(self, iter); store = _SELF(self); model = GTK_TREE_MODEL(store); if (RVAL2CBOOL(rb_obj_is_kind_of(values, rb_cHash))) { hash_to_values(values, iter, model, g_columns, g_values, length); } else if (RVAL2CBOOL(rb_obj_is_kind_of(values, rb_cArray))) { array_to_values(values, iter, model, g_columns, g_values, length); } else { rb_raise(rb_eArgError, "must be array or hash of values"); } gtk_list_store_set_valuesv(store, RVAL2GTKTREEITER(iter), g_columns, g_values, length); for (i = 0; i < length; i++) g_value_unset(&g_values[i]); return self; }