focus-out-event and GtkEntry



I need to check data a user inputs on one of numerous GtkEntry's on window,
and I need to handle the situation when the entry loses focus (by TABing out
of the field, or by mouse control.  When I encouter bad input, I bring up a
dialog box.  The problem is I get an GtkWarning and GtkError:

the GtkWarning is:

   Gtk-WARING **: GtkEntry - did not receive focus-out-event. If you
   connect to a handler to this signal, it must return
   FALSE so the entry gets the event as well.

the Error is a message box:

Gtk-ERROR **: file gtkentry.c: line 4886 (blink_cb): assertion failed: (GTK_WIDGET_HAS_FOCUS(entry))
   aborting...

a sample C program which duplicates the error is below. Is there anyway to bring up a dialog box
in a focus-out-event handler that wont trigger this error?
I am using  GTK version 2.6.4  on Windows XP.

Zvi

/* test2.c */

   #include <gtk/gtk.h>

   GtkWidget *frm_main, *entry1, *entry2, *box;

   void dstry()
   {
       gtk_main_quit();
   }

   int activate(GtkWidget *w, void *p)
   {
        g_print("in activate()\n");
        check_data(w);
        g_print("leaving activate()\n");
    return FALSE;
   }

   int focus_out(GtkWidget *w, void *p)
   {
    g_print("in focus_out()\n");
    check_data(w);
    g_print("leaving focus_out()\n");
    return FALSE;
   }

   int check_data(GtkWidget *w)
   {
    GtkWidget *dialog;
    int resp;
    char *data = gtk_entry_get_text(w);

    g_print("in check_data(), data = \"%s\"\n", data);

    if (!strcmp(data, "abcd"))
    {
     g_print("leaving check_data(1)\n");
     return 1;
    }

        dialog = gtk_message_dialog_new (GTK_WINDOW (frm_main),
              GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
              GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
              "INVALID DATA");

        switch (resp = gtk_dialog_run (GTK_DIALOG (dialog))) {
        case GTK_RESPONSE_OK:
        default:
             gtk_widget_destroy (dialog);
             g_print("leaving check_data(0)\n");
             return 0;
        }
}

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);

frm_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(frm_main),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(frm_main), 500, 500);
g_signal_connect (G_OBJECT(frm_main), "destroy", G_CALLBACK (dstry), NULL);

box = gtk_hbox_new(TRUE, 10);
gtk_container_add(GTK_CONTAINER(frm_main), box);

entry1 = gtk_entry_new_with_max_length(20);
gtk_container_add(GTK_CONTAINER(box), entry1);
g_signal_connect (G_OBJECT (entry1), "focus-out-event",
                   G_CALLBACK (focus_out), NULL);
g_signal_connect (G_OBJECT (entry1), "activate",
                   G_CALLBACK (activate), NULL);

entry2 = gtk_entry_new_with_max_length(20);
gtk_container_add(GTK_CONTAINER(box), entry2);

gtk_widget_show_all(frm_main);
gtk_main();
exit (0);
}




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]