focus-out-event and GtkEntry
- From: "Zvi Sebrow" <zvi sebrow verizon net>
- To: <gtk-app-devel-list gnome org>
- Subject: focus-out-event and GtkEntry
- Date: Thu, 06 Sep 2007 14:49:12 -0400
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]