Hi Ian, when you connect a callback function you have to make sure that the functions parameter list is appropriate to the signal you connect it to. You can't use the same callback function since they have a different signature: "activate" void user_function( GtkEntry *entry, gpointer user_data); "focus-out-event" gboolean user_function( GtkWidget *widget, GdkEventFocus *event, gpointer user_data); When GTK calls the "focus-out-event" it places three arguments for your callback function on the stack, but your "activate"-function only removes two of them. This means that when your function returns there is still some parameter data on the stack where it shouldn't be. This causes your application to crash. Regards...Peter > I'm trying to generate some code that checks the input a user has > provided into a text entry field, and appends a trailing character if > needed. I'd like to do it as soon as the user switches away from the > widget, and is presumably done editing. > > If I use an "activate" signal, things work fine - it does exactly what > I expect, with no complaints. > > However, if I use a "focus-out-event", the program eventually > terminates and I get, simply, a "Bus error" message. > > This happens using GTK+1.2.10, 2.0.6, as well as 2.2.1. > > Can anyone point me to what I'm doing wrong? > > Here's some of the code: > > Here's where I connect the signal and generate the widget: > > #if GTK_MAJOR_VERSION < 2 > > #define SIGNAL_CONNECT(widget, name, callback, arg) \ > gtk_signal_connect(GTK_OBJECT(widget), name, GTK_SIGNAL_FUNC(callback), > \ > (gpointer)(arg)) > > #else /* GTK_MAJOR_VERSION >= 2 */ > > #define SIGNAL_CONNECT(widget, name, callback, arg) \ > g_signal_connect(G_OBJECT(widget), name, G_CALLBACK(callback), \ > (gpointer)(arg)) > > fileopen_dir_te = create_preference_entry(main_tb, 9, > "Directory:", NULL, prefs.gui_fileopen_dir); > OBJECT_SET_DATA(main_vb, GUI_FILEOPEN_DIR_KEY, fileopen_dir_te); > SIGNAL_CONNECT(fileopen_dir_te, "focus-out-event", > fileopen_dir_changed_cb, NULL); > > Again, if I replace "focus-out-event" with "activate", things work fine > if I just hit enter in the text entry field. > > static void > fileopen_dir_changed_cb(GtkWidget *fileopen_entry _U_, gpointer > parent_w) > { > char *lastchar; > gint fileopen_dir_te_length; > > fileopen_dir_te = (GtkWidget *)OBJECT_GET_DATA(parent_w, > GUI_FILEOPEN_DIR_KEY); > fileopen_dir_te_length = strlen(gtk_entry_get_text > (GTK_ENTRY(fileopen_entry))); > lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_entry), > fileopen_dir_te_length-1, -1); > if (strcmp(lastchar, "/") != 0) > gtk_entry_append_text(GTK_ENTRY(fileopen_entry), "/"); > return; > } > > Is there a stupid mistake I made here? > > Thanks, > Ian -- ==================================================================== Peter Krüger applied software solutions (appss) GmbH Sandtorstr. 23 D-39106 Magdeburg Germany Phone: +49-(0)391-54486-19388 Fax: +49-(0)391-54486-19222 email: krueger@xxxxxxxx URL: http://www.appss.de Managing Director: Uwe Hess, Dietmar Schäfer Register: HRB12386, AG Mageburg "Virtual business becomes reality!" This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden. ==================================================================== _______________________________________________ gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list