From a150c2cbc3d2c668f7aced6932f061450c9b1501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Tue, 6 Dec 2022 11:21:06 +0100 Subject: [PATCH] Switch library documentation to gi-docgen Switch from gtk-doc to gi-docgen for the library documentation and adjust the source files accordingly. We don't bother about the daemon doc headers as they're not built into any docs atm. Closes: #56 --- debian/control | 4 +- debian/libfeedback-dev.install | 2 +- debian/libfeedback-dev.links | 1 + doc/build-howto.md | 57 +++++++++++++++++ doc/initialization.md | 34 ++++++++++ doc/libfeedback-docs.xml | 68 -------------------- doc/libfeedback.toml.in | 42 +++++++++++++ doc/meson.build | 72 +++++++++++---------- doc/overview.md | 23 +++++++ doc/overview.xml | 111 --------------------------------- doc/xml/gtkdocentities.ent.in | 11 ---- doc/xml/meson.build | 11 ---- libfeedback/lfb-event.c | 108 ++++++++++++++++---------------- libfeedback/libfeedback.c | 32 +--------- 14 files changed, 257 insertions(+), 319 deletions(-) create mode 100644 debian/libfeedback-dev.links create mode 100644 doc/build-howto.md create mode 100644 doc/initialization.md delete mode 100644 doc/libfeedback-docs.xml create mode 100644 doc/libfeedback.toml.in create mode 100644 doc/overview.md delete mode 100644 doc/overview.xml delete mode 100644 doc/xml/gtkdocentities.ent.in delete mode 100644 doc/xml/meson.build diff --git a/debian/control b/debian/control index f7657cc..1b504d9 100644 --- a/debian/control +++ b/debian/control @@ -5,9 +5,10 @@ Maintainer: Guido Günther Build-Depends: dbus, debhelper-compat (= 12), + docbook-xsl , dh-sequence-gir, gsettings-desktop-schemas , - gtk-doc-tools, + gi-docgen , json-glib-tools, libgirepository1.0-dev, libglib2.0-dev, @@ -17,6 +18,7 @@ Build-Depends: meson, pkg-config, valac, + xsltproc , Standards-Version: 4.4.0 Homepage: https://source.puri.sm/Librem5/feedbackd diff --git a/debian/libfeedback-dev.install b/debian/libfeedback-dev.install index 51ccd17..e07f1b2 100644 --- a/debian/libfeedback-dev.install +++ b/debian/libfeedback-dev.install @@ -1,6 +1,6 @@ /usr/include /usr/share/gir-1.0/ -/usr/share/gtk-doc/ +/usr/share/doc/libfeedback-0 /usr/share/doc/libfeedback-dev/ /usr/share/vala/ /usr/lib/*/libfeedback-*.so /usr/lib/*/pkgconfig/libfeedback-*.pc diff --git a/debian/libfeedback-dev.links b/debian/libfeedback-dev.links new file mode 100644 index 0000000..01e421a --- /dev/null +++ b/debian/libfeedback-dev.links @@ -0,0 +1 @@ +usr/share/doc/libfeedback-dev/libfeedback-0 usr/share/devhelp/books/libfeedback-0 diff --git a/doc/build-howto.md b/doc/build-howto.md new file mode 100644 index 0000000..c05f575 --- /dev/null +++ b/doc/build-howto.md @@ -0,0 +1,57 @@ +Title: Compiling with libfeedback +Slug: building + +# Compiling with libfeedback + +If you need to build libfeedback, get the source from +[here](https://source.puri.sm/Librem5/feedbackd) and see the `README.md` file. + +## Using `pkg-config` + +Like other GObject based libraries, libfeedback uses `pkg-config` to provide compiler +options. The package name is `libfeedback-0.0`. + +When using the Meson build system you can declare a dependency like: + +```meson +dependency('libfeedback-0.0') +``` + +## Bundling the Library + +### Using a Subproject + +Libfeedback can be used as a Meson subproject. Create a +`subprojects/libfeedback.wrap` file with the following contents: + +```ini +[wrap-git] +directory=libfeedback +url=https://source.puri.sm/Librem5/feedbackd.git +revision=main +depth=1 +``` + +Add this to your `meson.build`: + +```meson +libfeedback = dependency( + 'libfeedback-0.0', + version: '>= 0.0.1', + fallback: ['libfeedback', 'libfeedback_dep'], + default_options: [ + 'daemon=false', + 'man=false', + 'gtk_doc=false', + 'vapi=false', + 'tests=false', + ] +) +``` + +Then the `libfeedback` variable can be used as a dependency. + +# Next Steps + +Once libfeedback has been compiled and included into your project, it needs to be +initialized. See [Initialization](initialization.html). diff --git a/doc/initialization.md b/doc/initialization.md new file mode 100644 index 0000000..a5d58c1 --- /dev/null +++ b/doc/initialization.md @@ -0,0 +1,34 @@ +Title: Initialization +Slug: initialization + +# Initialization + +Before using libfeedback, it must be initialized. To use the library +call [func@Lfb.init]() with the id of your application (usually +the desktop file name without the .desktop extension). For that you +include the `libfeedback.h` header. Since the API is considered +unstable at this point in time you need to acknowledge this by +definining `LIBFEEDBACK_USE_UNSTABLE_API`: + +```c + #define LIBFEEDBACK_USE_UNSTABLE_API + #include + + int main(void) + { + g_autoptr (GError) *err = NULL; + if (lfb_init ("com.example.appid", &err)) { + g_error ("%s", err->message); + } + ... + lfb_uninit (); + return 0; + } +``` + +You can also acknowledge this with the definition option of your C +compiler, like `-DFEEDBACK_USE_UNSTABLE_API`. + +After initializing the library you can trigger feedback using +[class@Lfb.Event] objects. When your application finishes call +[func@Lfb.uninit]() to free any resources: diff --git a/doc/libfeedback-docs.xml b/doc/libfeedback-docs.xml deleted file mode 100644 index 5a9f5ad..0000000 --- a/doc/libfeedback-docs.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - %gtkdocentities; -]> - - - &package_name; Reference Manual - - This document is the API reference for &package_name; &package_version; - - Libfeedback is a library to trigger - feedback (such as haptic feedback) via events sent by your application. - - - If you find any issues in this API reference, please report it using - the bugtracker. - - - - - 2020 - Purism SPC - - - - - - - API Reference - - - Core API - - - - - - Low level api - - - - - - DBus Interface - - - - - - Object Hierarchy - - - - - API Index - - - - - Annotations glossary - - - - diff --git a/doc/libfeedback.toml.in b/doc/libfeedback.toml.in new file mode 100644 index 0000000..012ca0e --- /dev/null +++ b/doc/libfeedback.toml.in @@ -0,0 +1,42 @@ +[library] +version = "@VERSION@" +description = "A library to trigger feedback (such as haptic feedback) via events sent by your application." +authors = "Purism SPC" +license = "LGPL-2.1-or-later" +browse_url = "https://source.puri.sm/Librem5/feedbackd/" +repository_url = "https://source.puri.sm/Librem5/feedbackd.git" +website_url = "https://source.puri.sm/Librem5/feedbackd/" +dependencies = [ + "Gio-2.0", + "GLib-2.0", +] +devhelp = true +search_index = true + +[dependencies."Gio-2.0"] +name = "GIO" +description = "GObject Interfaces and Objects, Networking, IPC, and I/O" +docs_url = "https://docs.gtk.org/gio/" + +[dependencies."GLib-2.0"] +name = "GLib " +description = "The base type system library" +docs_url = "https://docs.gtk.org/glib/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[source-location] +# The base URL for the web UI +base_url = "https://source.puri.sm/Librem5/feedbackd/-/blob/main/" +# The format for links, using "filename" and "line" for the format +file_format = "{filename}#L{line}" + +[extra] +content_files = [ + "overview.md", + "build-howto.md", + "initialization.md", +] diff --git a/doc/meson.build b/doc/meson.build index f74b474..131fa5f 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -1,41 +1,49 @@ if get_option('gtk_doc') -subdir('xml') - -private_headers = [ +expand_content_md_files = [ + 'overview.md', + 'build-howto.md', + 'initialization.md', ] -content_files = [ - 'overview.xml', -] +toml_data = configuration_data() +toml_data.set('VERSION', meson.project_version()) -glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix') -glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html') -docpath = join_paths(get_option('datadir'), 'gtk-doc', 'html') +libfeedback_toml = configure_file( + input: 'libfeedback.toml.in', + output: 'libfeedback.toml', + configuration: toml_data +) + +dependency('gi-docgen', version: '>= 2021.1', + fallback: ['gi-docgen', 'dummy_dep'], + native: true, + required: get_option('gtk_doc')) + +gidocgen = find_program('gi-docgen') + +docs_dir = datadir / 'doc' + +custom_target('libfeedback-doc', + input: [ libfeedback_toml, libfeedback_gir[0] ], + output: 'libfeedback-0', + command: [ + gidocgen, + 'generate', + '--quiet', + '--add-include-path=@0@'.format(meson.current_build_dir() / '../src'), + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--no-namespace-dir', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + depend_files: [ expand_content_md_files ], + build_by_default: true, + install: true, + install_dir: docs_dir, +) -gnome.gtkdoc('libfeedback', - main_xml: 'libfeedback-docs.xml', - src_dir: [ - join_paths(meson.source_root(), 'libfeedback'), - join_paths(meson.build_root(), 'libfeedback'), - join_paths(meson.build_root(), 'data'), - ], - dependencies: libfeedback_dep, - gobject_typesfile: 'libfeedback.types', - scan_args: [ - '--rebuild-types', - '--ignore-headers=' + ' '.join(private_headers), - ], - fixxref_args: [ - '--html-dir=@0@'.format(docpath), - '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')), - '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')), - '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gio')), - '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gi')), - ], - install_dir: 'libfeedback', - content_files: content_files, - install: true) endif if get_option('man') diff --git a/doc/overview.md b/doc/overview.md new file mode 100644 index 0000000..9b20acf --- /dev/null +++ b/doc/overview.md @@ -0,0 +1,23 @@ +Title: Overview +Slug: Overview + +# Libfeedback Introduction + +The purpose of libfeedback is to make it simple to supply audible, +haptic and visual feedback to the user. This is done by +notifying a feedback_daemon over DBus that a certain event +happened. The daemon then selects the appropriate feedbacks (such +as a buzzing haptic motor or playing an audio file) based on the +user session's current feedback profile, feedback theme and +available hardware. + +Events are identified by strings like `message-new-sms` or +`message-new-sms`. The available event names are described in the +[Event naming specification](Event-naming-spec-0.0.0.html). + +Libfeedback provides synchronous and asynchronous APIs to trigger and +stop feedback for these events and is usable from other languages than +C by GObject introspection. + +See [Compiling with libfeedback](build-howto.html) on how to include +libfeedback in your project. diff --git a/doc/overview.xml b/doc/overview.xml deleted file mode 100644 index f6b7021..0000000 --- a/doc/overview.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - %gtkdocentities; -]> - - - Libfeedback Overview - - - Introduction - - - The purpose of libfeedback is to make it simple to supply - audible, haptic and visual feedback to the user. This is done - by notifying a &feedback_daemon; over DBus that a certain event - happened and the daemon selects the appropriate feedbacks (such as - a buzzing haptic motor or playing an audio file) based - on the user session's current feedback profile, feedback theme and available - hardware. Events are identified by strings like - message-new-sms or - message-new-sms. The available event names are - described in the &event_naming_spec;. - - - &package; provides synchronous and asynchronous APIs to trigger - and stop feedback for these events and is usable from other languages - than C by GObject introspection. - - - - - Compiling libfeedback applications - - Using pkg-config - - Like other GNOME libraries, - &package_string; uses - pkg-config to provide compiler options. The - package name is - "&package_ver_str;". So in - your configure.ac script, you might specify something - like: - - - PKG_CHECK_MODULES(LIBFEEDBACK, [&package_string;-&package_api_version;]) - AC_SUBST(LIBFEEDBACK_CFLAGS) - AC_SUBST(LIBFEEDBACK_LIBS) - - - - - Using Meson/Ninja - - If using Meson/Ninja use a dependency('&package_string;-&package_api_version;') - dependency. - - - - The "&package_api_version;" in the package name is the "API version" - (indicating "the version of the &package_string; API - that first appeared in version &package_api_version;") and is essentially just part of - the package name. - - - - When using the Meson build system you can declare a dependency like - - - dependency(libfeedback-0.0') - - - - - - Acknowledge the Instability - - - Since the library is young and is still changing a lot, in order to use it you are required to acknowledge that your are using an unstable API. - To do so, LIBFEEDBACK_USE_UNSTABLE_API must be defined for compilation to succeed. - - - - From C code or any compatible language, you can prefix your inclusion of the &package_string; header like so: - - - - #define LIBFEEDBACK_USE_UNSTABLE_API - #include <libfeedback.h> - - - - Including individual headers rather than libfeedback.h is not - recommended. - - - You can also acknowledge this with the definition option of your C compiler, like -DFEEDBACK_USE_UNSTABLE_API. - This is required from Vala. - - - - To use &package_name; from Vala, you must define the acknowledgment in C via -X -DFEEDBACK_USE_UNSTABLE_API. - If your build system uses a two pass compilation and hence your Vala compiler outputs C (Meson, Automake, or using the --ccode Vala compiler option trigger that) then you must add -DLIBFEEDBACK_USE_UNSTABLE_API to your C compiler arguments instead. - - - - - - diff --git a/doc/xml/gtkdocentities.ent.in b/doc/xml/gtkdocentities.ent.in deleted file mode 100644 index 9dcbf33..0000000 --- a/doc/xml/gtkdocentities.ent.in +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - -Event naming specification draft"> -Feedback Daemon"> diff --git a/doc/xml/meson.build b/doc/xml/meson.build deleted file mode 100644 index 6de270e..0000000 --- a/doc/xml/meson.build +++ /dev/null @@ -1,11 +0,0 @@ -ent_conf = configuration_data() -ent_conf.set('PACKAGE', 'libfeedback') -ent_conf.set('PACKAGE_BUGREPORT', 'https://source.puri.sm/Librem5/feedbackd/issues') -ent_conf.set('PACKAGE_NAME', 'libfeedback') -ent_conf.set('PACKAGE_STRING', 'libfeedback') -ent_conf.set('PACKAGE_TARNAME', 'libfeedback-' + meson.project_version()) -ent_conf.set('PACKAGE_URL', 'https://source.puri.sm/Librem5/feedbackd') -ent_conf.set('PACKAGE_VERSION', meson.project_version()) -ent_conf.set('PACKAGE_API_VERSION', apiversion) -configure_file(input: 'gtkdocentities.ent.in', output: 'gtkdocentities.ent', configuration: ent_conf) - diff --git a/libfeedback/lfb-event.c b/libfeedback/lfb-event.c index 04b0cc6..48b026b 100644 --- a/libfeedback/lfb-event.c +++ b/libfeedback/lfb-event.c @@ -10,7 +10,7 @@ #include /** - * SECTION:lfb-event + * LfbEvent: * @Short_description: An event triggering feedback to the user * @Title: LfbEvent * @@ -23,53 +23,53 @@ * One event can trigger multiple feedbacks at once (e.g. audio and * haptic feedback). This is determined by the feedback theme in * use (which is not under the appliction's control) and the active - * feedback profile (see #lfb_set_feedback_profile()). + * feedback profile (see [func@Lfb.set_feedback_profile](). * - * After initializing the library via #lfb_init() feedback can be + * After initializing the library via [func@Lfb.init]() feedback can be * triggered like: * - * |[ - * g_autoptr (GError) err = NULL; - * LfbEvent *event = lfb_event_new ("message-new-instant"); - * lfb_event_set_timeout (event, 0); - * if (!lfb_event_trigger_feedback (event, &err)) - * g_warning ("Failed to trigger feedback: %s", err->message); - * ]| + * ```c + * g_autoptr (GError) err = NULL; + * LfbEvent *event = lfb_event_new ("message-new-instant"); + * lfb_event_set_timeout (event, 0); + * if (!lfb_event_trigger_feedback (event, &err)) + * g_warning ("Failed to trigger feedback: %s", err->message); + * ``` * - * When all feedback for this event has ended the #LfbEvent::feedback-ended + * When all feedback for this event has ended the [signal@LfbEvent::feedback-ended] * signal is emitted. If you want to end the feedback ahead of time use - * #lfb_event_end_feedback (): + * [method@LfbEvent.end_feedback](): * - * |[ - * if (!lfb_event_end_feedback (event, &err)) - * g_warning ("Failed to end feedback: %s", err->message); - * ]| + * ```c + * if (!lfb_event_end_feedback (event, &err)) + * g_warning ("Failed to end feedback: %s", err->message); + * ``` * * Since these methods involve DBus calls there are asynchronous variants - * available, e.g. #lfb_event_trigger_feedback_async(): + * available, e.g. [method@LfbEvent.trigger_feedback_async](): * - * |[ - * static void - * on_feedback_triggered (LfbEvent *event, - * GAsyncResult *res, - * gpointer unused) - * { - * g_autoptr (GError) err = NULL; - * if (!lfb_event_trigger_feedback_finish (event, res, &err)) { - * g_warning ("Failed to trigger feedback for %s: %s", - * lfb_event_get_event (event), err->message); - * } - * } + * ```c + * static void + * on_feedback_triggered (LfbEvent *event, + * GAsyncResult *res, + * gpointer unused) + * { + * g_autoptr (GError) err = NULL; + * if (!lfb_event_trigger_feedback_finish (event, res, &err)) { + * g_warning ("Failed to trigger feedback for %s: %s", + * lfb_event_get_event (event), err->message); + * } + * } * - * static void - * my_function () - * { - * LfbEvent *event = lfb_event_new ("message-new-instant"); - * lfb_event_trigger_feedback_async (event, NULL, - * (GAsyncReadyCallback)on_feedback_triggered, - * NULL); - * } - * ]| + * static void + * my_function () + * { + * LfbEvent *event = lfb_event_new ("message-new-instant"); + * lfb_event_trigger_feedback_async (event, NULL, + * (GAsyncReadyCallback)on_feedback_triggered, + * NULL); + * } + * ``` */ enum { @@ -294,7 +294,7 @@ lfb_event_class_init (LfbEventClass *klass) * * How long feedback should be provided in seconds. The special value * %-1 uses the natural length of each feedback while %0 plays each feedback - * in a loop until ended explicitly via e.g. #lfb_event_end_feedback(). + * in a loop until ended explicitly via e.g. [method@LfbEvent.end_feedback](). */ props[PROP_TIMEOUT] = g_param_spec_int ( @@ -326,7 +326,7 @@ lfb_event_class_init (LfbEventClass *klass) * LfbEvent:feedback-profile: * * The name of the feedback profile to use for this event. See - * #lfb_event_set_feedback_profile() for details. + * [method@LfbEvent.set_feedback_profile]() for details. */ props[PROP_FEEDBACK_PROFILE] = g_param_spec_string ( @@ -363,10 +363,10 @@ lfb_event_init (LfbEvent *self) * lfb_event_new: * @event: The event's name. * - * Creates a new #LfbEvent based on the given event - * name. See #LfbEvent:event for details. + * Creates a new [class@Lfb.Event] based on the given event + * name. See [property@Lfb.Event:event] for details. * - * Returns: The #LfbEvent. + * Returns: The [class@Lfb.Event]. */ LfbEvent * lfb_event_new (const char *event) @@ -446,13 +446,13 @@ lfb_event_trigger_feedback (LfbEvent *self, GError **error) /** * lfb_event_trigger_feedback_async: * @self: The event to trigger feedback for. - * @cancellable: (nullable): A #GCancellable or %NULL. + * @cancellable: (nullable): A #GCancellable to cancel the operation or %NULL. * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. * @user_data: User data to pass to @callback. * * Tells the feedback server to provide proper feedback for the give * event to the user. This is the sync version of - * #lfb_event_trigger_feedback. + * [method@LfbEvent.trigger_feedback](). */ void lfb_event_trigger_feedback_async (LfbEvent *self, @@ -494,11 +494,10 @@ lfb_event_trigger_feedback_async (LfbEvent *self, /** * lfb_event_trigger_feedback_finish: * @self: the event - * @res: Result object passed to the callback of - * #lfb_event_trigger_feedback_async + * @res: Result object passed to the callback of [method@LfbEvent.trigger_feedback_async] * @error: Return location for error * - * Finish an async operation started by lfb_event_trigger_feedback_async. You + * Finish an async operation started by [method@LfbEvent.trigger_feedback_async](). You * must call this function in the callback to free memory and receive any * errors which occurred. * @@ -544,8 +543,7 @@ lfb_event_end_feedback (LfbEvent *self, GError **error) /** * lfb_event_end_feedback_finish: * @self: the event - * @res: Result object passed to the callback of - * #lfb_event_end_feedback_async + * @res: Result object passed to the callback of [method@LfbEvent.end_feedback_async]() * @error: Return location for error * * Finish an async operation started by lfb_event_end_feedback_async. You @@ -553,7 +551,7 @@ lfb_event_end_feedback (LfbEvent *self, GError **error) * errors which occurred. * * This does not mean that the feedbacks finished right away. Connect to the - * #LfbEvent::feedback-ended signal for this. + * [@signal@LfbEvent::feedback-ended] signal for this. * * Returns: %TRUE if ending the feedbacks was successful */ @@ -570,7 +568,7 @@ lfb_event_end_feedback_finish (LfbEvent *self, /** * lfb_event_end_feedback_async: * @self: The event to end feedback for. - * @cancellable: (nullable): A #GCancellable or %NULL. + * @cancellable: (nullable): A #GCancellable to cancel the operation or %NULL. * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. * @user_data: User data to pass to @callback. * @@ -611,10 +609,10 @@ lfb_event_end_feedback_async (LfbEvent *self, * Tells the feedback server to end feedack after #timeout seconds. * The value -1 indicates to not set a timeout and let feedbacks stop * on their own while 0 indicates to loop all feedbacks endlessly. - * They must be stopped via #lfb_event_end_feedback () in this case. + * They must be stopped via [method@LfbEvent.end_feedback]() in this case. * * It is an error to change the timeout after the feedback has been triggered - * via lfb_event_trigger. + * via [method@LfbEvent.trigger_feedback](). */ void lfb_event_set_timeout (LfbEvent *self, gint timeout) @@ -649,7 +647,7 @@ lfb_event_get_event (LfbEvent *self) * * Get the currently set timeout. * - * Returns: The event timeout in msecs + * Returns: The event timeout in milliseconds */ gint lfb_event_get_timeout (LfbEvent *self) diff --git a/libfeedback/libfeedback.c b/libfeedback/libfeedback.c index 76d8c6b..e3b3012 100644 --- a/libfeedback/libfeedback.c +++ b/libfeedback/libfeedback.c @@ -9,34 +9,6 @@ #include "lfb-names.h" -/** - * SECTION:libfeedback - * @Short_description: Library initialization and helpers - * @Title: libfeedback - * - * To use the library call #lfb_init() with the id of your application - * (usually the desktop file name without the .desktop extension). - * After initializing the library you can trigger feedback using - * #LfbEvent objects. When your application finishes call - * #lfb_uninit() to free any resources: - * - * |[ - * #define LIBFEEDBACK_USE_UNSTABLE_API - * #include - * - * int main(void) - * { - * g_autoptr (GError) *err = NULL; - * if (lfb_init ("com.example.appid", &err)) { - * g_error ("%s", err->message); - * } - * ... - * lfb_uninit (); - * return 0; - * } - * ]| - */ - static LfbGdbusFeedback *_proxy; static char *_app_id; static gboolean _initted; @@ -99,7 +71,7 @@ _lfb_get_proxy (void) * @app_id: The application id * @error: Error information * - * Initialize libfeedback. This must be called before any other functions. + * Initialize libfeedback. This must be called before any other of libfeedback's functions. * * Returns: %TRUE if successful, or %FALSE on error. */ @@ -159,6 +131,8 @@ lfb_set_app_id (const char *app_id) /** * lfb_get_app_id: * + * Get the application id set via [func@Lfb.set_app_id](). + * * Returns: the application id. */ const gchar *