Как насчет обеспечения порядка вызовов, сохраняя ваши обратные вызовы явно в списке, а затем используя одну функцию g_timeout_add () для вызова функции, которая выполняет итерацию по этому списку?
static gboolean
call_in_order (GList* callbacks)
{
for (; callbacks != NULL; callbacks = callbacks->next)
{
g_assert (callbacks->data != NULL);
GSourceFunc callback = (GSourceFunc)(callbacks->data);
callback(NULL);
}
}
...
GList *callbacks = NULL;
callbacks = g_list_append(callbacks, func1);
callbacks = g_list_append(callbacks, func2);
callbacks = g_list_append(callbacks, func3);
callbacks = g_list_append(callbacks, func4);
g_timeout_add(0, (GSourceFunc)call_in_order, callbacks);