There is a function in glib called g_idle_add which makes it so the function will be called in the main loop, avoiding locking problems. What I typically do is wrap functions like I've shown below so you basically call thread_button_set_label instead of gtk_button_set_label and everything works out. The code below basically takes the data, sticks it into the pointer that g_idle_add needs, and sends it through to be processed. I haven't tested the code but I think it's all correct. - Brian typedef struct { GtkButton *button; gchar *label; } ButtonData; void thread_button_set_label_BD (ButtonData *data) { gtk_button_set_label (data->button, data->label); g_free (data->label); g_free (data); } void thread_button_set_label (GtkButton *button, gchar *label) { ButtonData *data = g_alloc (sizeof (ButtonData)); data->button = button; data->label = g_strdup( label ); g_idle_add (thread_button_set_label_BD, data); } _______________________________________________ gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list