summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisenmann <p3732@getgoogleoff.me>2023-04-16 21:20:59 +0200
committerPeter Eisenmann <peter.eisenmann@vigem.de>2023-05-02 13:42:54 +0200
commit3abf23b2a7958bbbed44da519bee681651053f9d (patch)
treed84a0a1ace2138f1e31ec208774c4fab9a7a9758
parentc86fde7e02bb942af2165fb7e7a1947469ed45bc (diff)
downloadglib-3abf23b2a7958bbbed44da519bee681651053f9d.tar.gz
add g_timeout_add_seconds_once
Add a new call combing behaviors of g_timeout_add_seconds and g_timeout_add_once.
-rw-r--r--docs/reference/glib/glib-sections.txt.in1
-rw-r--r--glib/gmain.c20
-rw-r--r--glib/gmain.h4
-rw-r--r--glib/tests/timeout.c20
4 files changed, 45 insertions, 0 deletions
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
<SUBSECTION>
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
@@ -20,6 +20,12 @@ unreachable_callback (gpointer data)
}
static void
+unreachable_void_callback (gpointer data)
+{
+ g_assert_not_reached ();
+}
+
+static void
test_seconds (void)
{
guint id;
@@ -52,6 +58,19 @@ test_seconds (void)
}
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)
{
guint id;
@@ -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);