Re: Passing Glists to callbacks
- From: Adam <adam ajtee plus com>
- To: Tristan Van Berkom <tvb gnome org>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: Passing Glists to callbacks
- Date: Mon, 5 Dec 2005 20:48:17 +0000
On Monday 05 December 2005 21:20, Tristan Van Berkom wrote:
Adam wrote:
Hi all,
[...]
Any suggestions are of value.
Hi,
Its hard to make out what exactly it is your doing...
it would be helpfull if you posted a short example
of code that doesn't work.
See below:
typedef struct instsdata
{
GList *instruments;
GtkWidget *hbox;
}instsdata;
static gboolean
cell_clicked(GtkTreeSelection *selection,
GtkTreeModel *model,
GtkTreePath *path,
gboolean path_currently_selected,
gpointer user_data)
{
gboolean ret = FALSE;
g_print("In cell_clicked callback\n");
instsdata *cbdata = (instsdata *)user_data;
GtkWidget *list;
GtkListStore *list_store;
GtkTreeIter iter;
GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
GList *instruments = cbdata->instruments;
list_store = gtk_list_store_new (1, G_TYPE_STRING); /* label */
list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (list),
0, "Instrument",
renderer,
"text", 0, NULL);
if (gtk_tree_model_get_iter(model, &iter, path))
{
gchar *name;
gtk_tree_model_get(model, &iter, 0, &name, -1);
if (!path_currently_selected)
{
InstrumentType type = lookuptype(name);
g_print("Name %s, Type %d\n", name, type);
g_print("Entire Instruments List length %d\t",
g_list_length(instruments));
for(GList *tmp=instruments; tmp; tmp=tmp->next)
{
g_print("Individual List type %d \t ", ((InstrumentList *)
instruments->data)->type);
if(type == ((InstrumentList *) (instruments)->data)->type)
{
g_print("Individual List length %d",
g_list_length(((InstrumentList *) (instruments)->data)->instruments));
for(GList *inst = ((InstrumentList *)
(instruments)->data)->instruments; inst; inst=inst->next)
{
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter, 0,
_(((InstrumentConfig *)inst->data)->name->str), -1);
}
break;
}
}
}
g_free(name);
}
gtk_box_pack_start (GTK_BOX (cbdata->hbox), list, TRUE, TRUE, 0);
gtk_widget_show_all(cbdata->hbox);
return ret;
}
A common mistake when passing lists in as arguments to
a callback *that modifies the list* is when people pass
in the head node itself instead of its address, since
you almost always want to re-assign the head node after
any list operations.
i.e. the callback should look like:
gint
my_hash_foreach_list_accum (gpointer key,
gpointer value,
GList **accum)
{
if (frobnicate (key, value)) {
*accum = g_list_prepend (*accum, value);
}
}
I'll give it a try
Adam
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]