Improved main loop test. (Quits main loop properly, makes it more obvious

Mon Mar 30 16:35:57 1998  Owen Taylor  <owt1@cornell.edu>

	* gtk/testgtk.c: Improved main loop test. (Quits main
	loop properly, makes it more obvious to the user
	what is going on)

	* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
	allocation _after_ clearing the window.

	* configure.in: If can't find XShmAttach in Xext, check
	in XextSam (for AIX).

	* gtk/gtkmain.c (gtk_events_pending): Remember, small
	numbers are _high_ priority for idle queues.

	* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
	removing the currently running timeout.

	* gtk/testgtk.c (timeout_test): Use the right prototype
	for callback.
This commit is contained in:
Owen Taylor 1998-03-30 23:04:51 +00:00 committed by Owen Taylor
parent 8eb7761e72
commit 4bf5d761bc
12 changed files with 280 additions and 42 deletions

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -1,3 +1,24 @@
Mon Mar 30 16:35:57 1998 Owen Taylor <owt1@cornell.edu>
* gtk/testgtk.c: Improved main loop test. (Quits main
loop properly, makes it more obvious to the user
what is going on)
* gtk/gtkwidget.c (gtk_widget_unparent): Reset the
allocation _after_ clearing the window.
* configure.in: If can't find XShmAttach in Xext, check
in XextSam (for AIX).
* gtk/gtkmain.c (gtk_events_pending): Remember, small
numbers are _high_ priority for idle queues.
* gtk/gtkmain.c (gtk_handle_current_timeouts): Allow
removing the currently running timeout.
* gtk/testgtk.c (timeout_test): Use the right prototype
for callback.
Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org> Mon Mar 30 21:40:21 1998 Tim Janik <timj@gtk.org>
* gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function, * gtk/gtkclist.c (gtk_clist_row_from_ypixel): removed this function,
@ -27,6 +48,7 @@ Sun Mar 29 22:29:00 1998 Tim Janik <timj@gtk.org>
Added wrapping capabilities to GtkSpinButton. New function : Added wrapping capabilities to GtkSpinButton. New function :
gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske). gtk_spin_button_set_wrap (Lars Hamann and Stefan Jeske).
>>>>>>> 1.302
Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu> Sat Mar 28 21:18:42 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkcombo.c (gtk_combo_disable_activate): * gtk/gtkcombo.c (gtk_combo_disable_activate):

View File

@ -109,7 +109,13 @@ AC_CHECK_LIB(X11, XOpenDisplay, x_libs="-lX11 $X_EXTRA_LIBS", no_x11_lib=yes, $X
if test "x$enable_shm" = "xyes"; then if test "x$enable_shm" = "xyes"; then
# Check for the Xext library (needed for XShm extention) # Check for the Xext library (needed for XShm extention)
AC_CHECK_LIB(Xext, XShmAttach, x_libs="-lXext $x_libs", no_xext_lib=yes, $x_libs) AC_CHECK_LIB(Xext, XShmAttach,
x_libs="-lXext $x_libs",
# On AIX, it is in XextSam instead, but we still need -lXext
AC_CHECK_LIB(XextSam, XShmAttach,
x_libs="-lXextSam -lXext $x_libs",
no_xext_lib=yes, $x_libs),
$x_libs)
fi fi
x_cflags="$X_CFLAGS" x_cflags="$X_CFLAGS"

View File

@ -152,6 +152,8 @@ static GList *idle_functions = NULL; /* A list of idle functions.
static GList *current_idles = NULL; static GList *current_idles = NULL;
static GList *current_timeouts = NULL; static GList *current_timeouts = NULL;
static GtkIdleFunction *running_idle = NULL;
static GtkTimeoutFunction *running_timeout = NULL;
static GMemChunk *timeout_mem_chunk = NULL; static GMemChunk *timeout_mem_chunk = NULL;
static GMemChunk *idle_mem_chunk = NULL; static GMemChunk *idle_mem_chunk = NULL;
static GMemChunk *quit_mem_chunk = NULL; static GMemChunk *quit_mem_chunk = NULL;
@ -403,7 +405,7 @@ gtk_events_pending (void)
gint result = gdk_events_pending() + ((next_event != NULL) ? 1 : 0); gint result = gdk_events_pending() + ((next_event != NULL) ? 1 : 0);
if (idle_functions && if (idle_functions &&
(((GtkIdleFunction *)idle_functions->data)->priority >= (((GtkIdleFunction *)idle_functions->data)->priority <=
GTK_PRIORITY_INTERNAL)) GTK_PRIORITY_INTERNAL))
result += 1; result += 1;
@ -844,6 +846,12 @@ gtk_timeout_remove (guint tag)
* (Which, basically, involves searching the * (Which, basically, involves searching the
* list for the tag). * list for the tag).
*/ */
if ((running_timeout) && (running_timeout->tag == tag))
{
gtk_timeout_destroy (running_timeout);
running_timeout = NULL;
}
tmp_list = timeout_functions; tmp_list = timeout_functions;
while (tmp_list) while (tmp_list)
{ {
@ -1079,6 +1087,12 @@ gtk_idle_remove (guint tag)
GtkIdleFunction *idlef; GtkIdleFunction *idlef;
GList *tmp_list; GList *tmp_list;
if ((running_idle) && (running_idle->tag == tag))
{
gtk_idle_destroy (running_idle);
running_idle = NULL;
}
tmp_list = idle_functions; tmp_list = idle_functions;
while (tmp_list) while (tmp_list)
{ {
@ -1301,27 +1315,29 @@ static void
gtk_handle_current_timeouts (guint32 the_time) gtk_handle_current_timeouts (guint32 the_time)
{ {
GList *tmp_list; GList *tmp_list;
GtkTimeoutFunction *timeoutf;
while (current_timeouts) while (current_timeouts)
{ {
tmp_list = current_timeouts; tmp_list = current_timeouts;
timeoutf = tmp_list->data; running_timeout = tmp_list->data;
current_timeouts = g_list_remove_link (current_timeouts, tmp_list); current_timeouts = g_list_remove_link (current_timeouts, tmp_list);
g_list_free (tmp_list); g_list_free (tmp_list);
if (gtk_invoke_timeout_function (timeoutf) == FALSE) if ((gtk_invoke_timeout_function (running_timeout) == FALSE) ||
(running_timeout == NULL))
{ {
gtk_timeout_destroy (timeoutf); if (running_timeout)
gtk_timeout_destroy (running_timeout);
} }
else else
{ {
timeoutf->interval = timeoutf->originterval; running_timeout->interval = running_timeout->originterval;
timeoutf->start = the_time; running_timeout->start = the_time;
gtk_timeout_insert (timeoutf); gtk_timeout_insert (running_timeout);
} }
} }
running_timeout = NULL;
} }
static void static void
@ -1411,19 +1427,20 @@ gtk_handle_current_idles ()
{ {
GList *tmp_list; GList *tmp_list;
GList *tmp_list2; GList *tmp_list2;
GtkIdleFunction *idlef;
while (current_idles) while (current_idles)
{ {
tmp_list = current_idles; tmp_list = current_idles;
idlef = tmp_list->data; running_idle = tmp_list->data;
current_idles = g_list_remove_link (current_idles, tmp_list); current_idles = g_list_remove_link (current_idles, tmp_list);
if (gtk_idle_invoke_function (idlef) == FALSE) if ((gtk_idle_invoke_function (running_idle) == FALSE) ||
(running_idle == NULL))
{ {
g_list_free (tmp_list); g_list_free (tmp_list);
gtk_idle_destroy (idlef); if (running_idle)
gtk_idle_destroy (running_idle);
} }
else else
{ {
@ -1432,7 +1449,7 @@ gtk_handle_current_idles ()
*/ */
tmp_list2 = idle_functions; tmp_list2 = idle_functions;
while (tmp_list2 && while (tmp_list2 &&
(((GtkIdleFunction *)tmp_list2->data)->priority <= idlef->priority)) (((GtkIdleFunction *)tmp_list2->data)->priority <= running_idle->priority))
tmp_list2 = tmp_list2->next; tmp_list2 = tmp_list2->next;
if (!tmp_list2) if (!tmp_list2)
@ -1453,6 +1470,7 @@ gtk_handle_current_idles ()
} }
} }
} }
running_idle = NULL;
} }
static void static void

View File

@ -1156,14 +1156,6 @@ gtk_widget_unparent (GtkWidget *widget)
GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED); GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
} }
/* Reset the width and height here, to force reallocation if we
* get added back to a new parent. This won't work if our new
* allocation is smaller than 1x1 and we actually want a size of 1x1...
* (would 0x0 be OK here?)
*/
widget->allocation.width = 1;
widget->allocation.height = 1;
if (widget->window && if (widget->window &&
GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_NO_WINDOW (widget) &&
GTK_WIDGET_DRAWABLE (widget)) GTK_WIDGET_DRAWABLE (widget))
@ -1173,6 +1165,14 @@ gtk_widget_unparent (GtkWidget *widget)
widget->allocation.width, widget->allocation.width,
widget->allocation.height); widget->allocation.height);
/* Reset the width and height here, to force reallocation if we
* get added back to a new parent. This won't work if our new
* allocation is smaller than 1x1 and we actually want a size of 1x1...
* (would 0x0 be OK here?)
*/
widget->allocation.width = 1;
widget->allocation.height = 1;
if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget)) if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
gtk_widget_unrealize (widget); gtk_widget_unrealize (widget);

View File

@ -5366,7 +5366,7 @@ create_scroll_test ()
*/ */
static int timer = 0; static int timer = 0;
void gint
timeout_test (GtkWidget *label) timeout_test (GtkWidget *label)
{ {
static int count = 0; static int count = 0;
@ -5374,6 +5374,8 @@ timeout_test (GtkWidget *label)
sprintf (buffer, "count: %d", ++count); sprintf (buffer, "count: %d", ++count);
gtk_label_set (GTK_LABEL (label), buffer); gtk_label_set (GTK_LABEL (label), buffer);
return TRUE;
} }
void void
@ -5573,33 +5575,61 @@ create_idle_test ()
} }
/* /*
* Basic Test * Test of recursive mainloop
*/ */
void void
create_test () mainloop_destroyed (GtkWidget *w, GtkWidget **window)
{
*window = NULL;
gtk_main_quit ();
}
void
create_mainloop ()
{ {
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
GtkWidget *label;
GtkWidget *button;
if (!window) if (!window)
{ {
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC(gtk_widget_destroyed), GTK_SIGNAL_FUNC(mainloop_destroyed),
&window); &window);
label = gtk_label_new ("In recursive main loop...");
gtk_misc_set_padding (GTK_MISC(label), 20, 20);
gtk_window_set_title (GTK_WINDOW (window), "test"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
gtk_container_border_width (GTK_CONTAINER (window), 0); TRUE, TRUE, 0);
gtk_widget_show (label);
button = gtk_button_new_with_label ("Leave");
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
FALSE, TRUE, 0);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
} }
if (!GTK_WIDGET_VISIBLE (window)) if (!GTK_WIDGET_VISIBLE (window))
{ {
gtk_widget_show (window); gtk_widget_show (window);
g_print ("create_test: start\n"); g_print ("create_mainloop: start\n");
gtk_main (); gtk_main ();
g_print ("create_test: done\n"); g_print ("create_mainloop: done\n");
} }
else else
gtk_widget_destroy (window); gtk_widget_destroy (window);
@ -5654,7 +5684,7 @@ create_main_window ()
{ "spinbutton", create_spins }, { "spinbutton", create_spins },
{ "statusbar", create_statusbar }, { "statusbar", create_statusbar },
{ "test idle", create_idle_test }, { "test idle", create_idle_test },
{ "test mainloop", create_test }, { "test mainloop", create_mainloop },
{ "test scrolling", create_scroll_test }, { "test scrolling", create_scroll_test },
{ "test selection", create_selection_test }, { "test selection", create_selection_test },
{ "test timeout", create_timeout_test }, { "test timeout", create_timeout_test },

View File

@ -5366,7 +5366,7 @@ create_scroll_test ()
*/ */
static int timer = 0; static int timer = 0;
void gint
timeout_test (GtkWidget *label) timeout_test (GtkWidget *label)
{ {
static int count = 0; static int count = 0;
@ -5374,6 +5374,8 @@ timeout_test (GtkWidget *label)
sprintf (buffer, "count: %d", ++count); sprintf (buffer, "count: %d", ++count);
gtk_label_set (GTK_LABEL (label), buffer); gtk_label_set (GTK_LABEL (label), buffer);
return TRUE;
} }
void void
@ -5573,33 +5575,61 @@ create_idle_test ()
} }
/* /*
* Basic Test * Test of recursive mainloop
*/ */
void void
create_test () mainloop_destroyed (GtkWidget *w, GtkWidget **window)
{
*window = NULL;
gtk_main_quit ();
}
void
create_mainloop ()
{ {
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
GtkWidget *label;
GtkWidget *button;
if (!window) if (!window)
{ {
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC(gtk_widget_destroyed), GTK_SIGNAL_FUNC(mainloop_destroyed),
&window); &window);
label = gtk_label_new ("In recursive main loop...");
gtk_misc_set_padding (GTK_MISC(label), 20, 20);
gtk_window_set_title (GTK_WINDOW (window), "test"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label,
gtk_container_border_width (GTK_CONTAINER (window), 0); TRUE, TRUE, 0);
gtk_widget_show (label);
button = gtk_button_new_with_label ("Leave");
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
FALSE, TRUE, 0);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
} }
if (!GTK_WIDGET_VISIBLE (window)) if (!GTK_WIDGET_VISIBLE (window))
{ {
gtk_widget_show (window); gtk_widget_show (window);
g_print ("create_test: start\n"); g_print ("create_mainloop: start\n");
gtk_main (); gtk_main ();
g_print ("create_test: done\n"); g_print ("create_mainloop: done\n");
} }
else else
gtk_widget_destroy (window); gtk_widget_destroy (window);
@ -5654,7 +5684,7 @@ create_main_window ()
{ "spinbutton", create_spins }, { "spinbutton", create_spins },
{ "statusbar", create_statusbar }, { "statusbar", create_statusbar },
{ "test idle", create_idle_test }, { "test idle", create_idle_test },
{ "test mainloop", create_test }, { "test mainloop", create_mainloop },
{ "test scrolling", create_scroll_test }, { "test scrolling", create_scroll_test },
{ "test selection", create_selection_test }, { "test selection", create_selection_test },
{ "test timeout", create_timeout_test }, { "test timeout", create_timeout_test },