diff --git a/docs/reference/glib/glib-sections.txt.in b/docs/reference/glib/glib-sections.txt.in index a674f8320..e7c3eda1b 100644 --- a/docs/reference/glib/glib-sections.txt.in +++ b/docs/reference/glib/glib-sections.txt.in @@ -586,6 +586,7 @@ g_timeout_add_once g_timeout_add_full g_timeout_add_seconds g_timeout_add_seconds_full +g_timeout_add_seconds_once g_idle_source_new diff --git a/glib/gmain.c b/glib/gmain.c index 13724c67f..9d9c123af 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -5471,6 +5471,26 @@ g_timeout_add_seconds (guint interval, return g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval, function, data, NULL); } +/** + * g_timeout_add_seconds_once: + * @interval: the time after which the function will be called, in seconds + * @function: function to call + * @data: data to pass to @function + * + * This function behaves like g_timeout_add_once() but with a range in seconds. + * + * Returns: the ID (greater than 0) of the event source + * + * Since: 2.78 + */ +guint +g_timeout_add_seconds_once (guint interval, + GSourceOnceFunc function, + gpointer data) +{ + return timeout_add_full (G_PRIORITY_DEFAULT, interval, TRUE, TRUE, (GSourceFunc) function, data, NULL); +} + /* Child watch functions */ #ifdef G_OS_WIN32 diff --git a/glib/gmain.h b/glib/gmain.h index ae3cc3ec5..7109e63dc 100644 --- a/glib/gmain.h +++ b/glib/gmain.h @@ -800,6 +800,10 @@ GLIB_AVAILABLE_IN_ALL guint g_timeout_add_seconds (guint interval, GSourceFunc function, gpointer data); +GLIB_AVAILABLE_IN_2_78 +guint g_timeout_add_seconds_once (guint interval, + GSourceOnceFunc function, + gpointer data); GLIB_AVAILABLE_IN_ALL guint g_child_watch_add_full (gint priority, GPid pid, diff --git a/glib/tests/timeout.c b/glib/tests/timeout.c index acbb8f3e1..1ae3f3a34 100644 --- a/glib/tests/timeout.c +++ b/glib/tests/timeout.c @@ -19,6 +19,12 @@ unreachable_callback (gpointer data) return G_SOURCE_REMOVE; } +static void +unreachable_void_callback (gpointer data) +{ + g_assert_not_reached (); +} + static void test_seconds (void) { @@ -51,6 +57,19 @@ test_seconds (void) g_source_remove (id); } +static void +test_seconds_once (void) +{ + /* Use the same principle as in test_seconds() */ + loop = g_main_loop_new (NULL, FALSE); + + g_timeout_add_once (2100, stop_waiting, NULL); + g_timeout_add_seconds_once (21475, unreachable_void_callback, NULL); + + g_main_loop_run (loop); + g_main_loop_unref (loop); +} + static void test_weeks_overflow (void) { @@ -192,6 +211,7 @@ main (int argc, char *argv[]) g_test_init (&argc, &argv, NULL); g_test_add_func ("/timeout/seconds", test_seconds); + g_test_add_func ("/timeout/seconds-once", test_seconds_once); g_test_add_func ("/timeout/weeks-overflow", test_weeks_overflow); g_test_add_func ("/timeout/far-future-ready-time", test_far_future_ready_time); g_test_add_func ("/timeout/rounding", test_rounding);