API: Add gtk_test_widget_wait_for_draw ()

See docs and following commits for what it's supposed to do. Let's hope
it fixes the flakiness in tests.
This commit is contained in:
Benjamin Otte 2013-05-17 01:35:04 +02:00
parent 51e238653d
commit 8616dbbad3
2 changed files with 41 additions and 0 deletions

View File

@ -116,6 +116,45 @@ test_find_widget_input_windows (GtkWidget *widget,
return g_slist_reverse (matches);
}
static gboolean
quit_main_loop_callback (GtkWidget *widget,
GdkFrameClock *frame_clock,
gpointer user_data)
{
gtk_main_quit ();
return G_SOURCE_REMOVE;
}
/**
* gtk_test_widget_wait_for_draw:
* @widget: the widget to wait for
*
* Enters the main loop and waits for @widget to be "drawn". In this
* context that means it waits for the frame clock of @widget to have
* run a full styling, layout and drawing cycle.
*
* This function is intended to be used for syncing with actions that
* depend on @widget relayouting or on interaction with the display
* server.
**/
void
gtk_test_widget_wait_for_draw (GtkWidget *widget)
{
g_return_if_fail (GTK_IS_WIDGET (widget));
/* We can do this here because the whole tick procedure does not
* reenter the main loop. Otherwise we'd need to manually get the
* frame clock and connect to the after-paint signal.
*/
gtk_widget_add_tick_callback (widget,
quit_main_loop_callback,
NULL,
NULL);
gtk_main ();
}
/**
* gtk_test_widget_send_key:
* @widget: Widget to generate a key press and release on.

View File

@ -61,6 +61,8 @@ GDK_AVAILABLE_IN_ALL
gboolean gtk_test_spin_button_click (GtkSpinButton *spinner,
guint button,
gboolean upwards);
GDK_AVAILABLE_IN_3_10
void gtk_test_widget_wait_for_draw (GtkWidget *widget);
GDK_AVAILABLE_IN_ALL
gboolean gtk_test_widget_click (GtkWidget *widget,
guint button,