[gimp/nielsdg/gi-docgen: 5/5] docs: Migrate from gtk-doc to gi-docgen




commit 18b9a3a7f76544c39774ee4c736b84ee6a0569aa
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Sun Nov 28 19:36:07 2021 +0100

    docs: Migrate from gtk-doc to gi-docgen
    
    gtk-doc has been slowly dying for the past few years; with gi-docgen we
    have a nice successor.
    
    This also makes sure the C documentation also uses the GIR file, which
    in turn means faster build times (since all the C code doesn't have to
    be parsed and recompiled again), and has a clear dependency graph.
    
    See the [gi-docgen tutorial] for more info on how the system works.
    
    [gi-docgen tutorial]: https://gnome.pages.gitlab.gnome.org/gi-docgen/tutorial.html

 .gitlab-ci.yml                                     |     9 +-
 CODING_STYLE.md                                    |     4 +-
 HACKING                                            |     3 -
 Makefile.am                                        |     5 +-
 autogen.sh                                         |    42 -
 build/flatpak/org.gimp.GIMP-nightly.json           |     3 +-
 configure.ac                                       |    38 +-
 data/images/meson.build                            |     1 +
 devel-docs/Makefile.am                             |    33 +-
 devel-docs/README.gtkdoc                           |   128 -
 devel-docs/app/.gitignore                          |    20 -
 devel-docs/app/Makefile.am                         |   128 -
 devel-docs/app/app-docs.sgml                       |  1404 --
 devel-docs/app/app-overrides.txt                   |     0
 devel-docs/app/app-sections.txt                    | 13945 -------------------
 devel-docs/app/app.types                           |   442 -
 devel-docs/app/meson.build                         |    98 -
 devel-docs/libgimp/Makefile.am                     |    85 -
 devel-docs/libgimp/libgimp3-docs.sgml              |   182 -
 devel-docs/libgimp/libgimp3-include.c              |    15 -
 devel-docs/libgimp/libgimp3-overrides.txt          |     0
 devel-docs/libgimp/libgimp3-sections.txt           |  1808 ---
 devel-docs/libgimp/libgimp3.types                  |    39 -
 devel-docs/libgimp/meson.build                     |    54 -
 devel-docs/libgimpbase/.gitignore                  |    21 -
 devel-docs/libgimpbase/Makefile.am                 |    65 -
 devel-docs/libgimpbase/libgimpbase3-docs.sgml      |    69 -
 devel-docs/libgimpbase/libgimpbase3-overrides.txt  |     0
 devel-docs/libgimpbase/libgimpbase3-sections.txt   |   552 -
 devel-docs/libgimpbase/libgimpbase3.types          |    17 -
 devel-docs/libgimpbase/meson.build                 |    39 -
 devel-docs/libgimpcolor/.gitignore                 |    20 -
 devel-docs/libgimpcolor/Makefile.am                |    58 -
 devel-docs/libgimpcolor/libgimpcolor3-docs.sgml    |    67 -
 .../libgimpcolor/libgimpcolor3-overrides.txt       |     0
 devel-docs/libgimpcolor/libgimpcolor3-sections.txt |   212 -
 devel-docs/libgimpcolor/libgimpcolor3.types        |     3 -
 devel-docs/libgimpcolor/meson.build                |    21 -
 devel-docs/libgimpconfig/.gitignore                |    20 -
 devel-docs/libgimpconfig/Makefile.am               |    64 -
 devel-docs/libgimpconfig/libgimpconfig3-docs.sgml  |    69 -
 .../libgimpconfig/libgimpconfig3-overrides.txt     |     0
 .../libgimpconfig/libgimpconfig3-sections.txt      |   206 -
 devel-docs/libgimpconfig/libgimpconfig3.types      |     7 -
 devel-docs/libgimpconfig/meson.build               |    30 -
 devel-docs/libgimpmath/.gitignore                  |    19 -
 devel-docs/libgimpmath/Makefile.am                 |    50 -
 devel-docs/libgimpmath/libgimpmath3-docs.sgml      |    47 -
 devel-docs/libgimpmath/libgimpmath3-overrides.txt  |     0
 devel-docs/libgimpmath/libgimpmath3-sections.txt   |   119 -
 devel-docs/libgimpmath/libgimpmath3.types          |     0
 devel-docs/libgimpmath/meson.build                 |    14 -
 devel-docs/libgimpmodule/.gitignore                |    20 -
 devel-docs/libgimpmodule/Makefile.am               |    59 -
 devel-docs/libgimpmodule/libgimpmodule3-docs.sgml  |    38 -
 .../libgimpmodule/libgimpmodule3-overrides.txt     |     0
 .../libgimpmodule/libgimpmodule3-sections.txt      |    57 -
 devel-docs/libgimpmodule/libgimpmodule3.types      |     6 -
 devel-docs/libgimpmodule/meson.build               |    23 -
 devel-docs/libgimpthumb/.gitignore                 |    20 -
 devel-docs/libgimpthumb/Makefile.am                |    59 -
 devel-docs/libgimpthumb/libgimpthumb3-docs.sgml    |    40 -
 .../libgimpthumb/libgimpthumb3-overrides.txt       |     0
 devel-docs/libgimpthumb/libgimpthumb3-sections.txt |    67 -
 devel-docs/libgimpthumb/libgimpthumb3.types        |     4 -
 devel-docs/libgimpthumb/meson.build                |    28 -
 devel-docs/libgimpwidgets/.gitignore               |    19 -
 devel-docs/libgimpwidgets/Makefile.am              |    89 -
 .../libgimpwidgets/libgimpwidgets3-docs.sgml       |   151 -
 .../libgimpwidgets/libgimpwidgets3-overrides.txt   |     0
 .../libgimpwidgets/libgimpwidgets3-sections.txt    |  1557 ---
 devel-docs/libgimpwidgets/libgimpwidgets3.types    |    52 -
 devel-docs/libgimpwidgets/meson.build              |    81 -
 devel-docs/libgimpwidgets/tmpl/.gitignore          |    58 -
 devel-docs/libgimpwidgets/tmpl/gimpstock.sgml      |  1553 ---
 devel-docs/libgimpwidgets/visual-index.xml         |   100 -
 devel-docs/meson.build                             |    16 +-
 devel-docs/{libgimp => reference}/.gitignore       |     0
 devel-docs/reference/Makefile.am                   |     7 +
 devel-docs/reference/gimp-ui/Makefile.am           |    26 +
 devel-docs/reference/gimp-ui/gimp-ui-3.0.toml.in   |   108 +
 .../gimp-ui/images/browser.png}                    |   Bin
 .../gimp-ui/images/busy-box.png}                   |   Bin
 .../gimp-ui/images/button.png}                     |   Bin
 .../gimp-ui/images/chain-button.png}               |   Bin
 .../gimp-ui/images/color-area.png}                 |   Bin
 .../gimp-ui/images/color-button.png}               |   Bin
 .../gimp-ui/images/color-hex-entry.png}            |   Bin
 .../gimp-ui/images/color-notebook.png}             |   Bin
 .../gimp-ui/images/color-profile-combo-box.png}    |   Bin
 .../gimp-ui/images/color-profile-view.png}         |   Bin
 .../gimp-ui/images/color-scale.png}                |   Bin
 .../gimp-ui/images/color-scales.png}               |   Bin
 .../gimp-ui/images/color-select.png}               |   Bin
 .../gimp-ui/images/color-selection.png}            |   Bin
 .../gimp-ui/images/dialog.png}                     |   Bin
 .../gimp-ui/images/enum-combo-box.png}             |   Bin
 .../gimp-ui/images/enum-label.png}                 |   Bin
 .../gimp-ui/images/file-entry.png}                 |   Bin
 .../gimp-ui/images/frame.png}                      |   Bin
 .../gimp-ui/images/hint-box.png}                   |   Bin
 .../gimp-ui/images/int-combo-box.png}              |   Bin
 .../gimp-ui/images/memsize-entry.png}              |   Bin
 .../gimp-ui/images/number-pair-entry.png}          |   Bin
 .../gimp-ui/images/offset-area.png}                |   Bin
 .../gimp-ui/images/page-selector.png}              |   Bin
 .../gimp-ui/images/path-editor.png}                |   Bin
 .../gimp-ui/images/pick-button.png}                |   Bin
 .../gimp-ui/images/preview-area.png}               |   Bin
 .../gimp-ui/images/ruler.png}                      |   Bin
 .../gimp-ui/images/string-combo-box.png}           |   Bin
 .../gimp-ui/images/unit-combo-box.png}             |   Bin
 devel-docs/reference/gimp-ui/meson.build           |    38 +
 devel-docs/reference/gimp-ui/widget-gallery.md     |    36 +
 devel-docs/reference/gimp/Makefile.am              |    24 +
 devel-docs/reference/gimp/gimp-3.0.toml.in         |    74 +
 devel-docs/reference/gimp/meson.build              |    35 +
 devel-docs/reference/meson.build                   |     4 +
 devel-docs/tools/.gitignore                        |     6 -
 devel-docs/tools/Makefile.am                       |    55 -
 devel-docs/tools/README.shooter                    |    13 -
 devel-docs/tools/meson.build                       |    28 -
 devel-docs/tools/shadow.c                          |   149 -
 devel-docs/tools/shadow.h                          |     8 -
 devel-docs/tools/shooter.c                         |   179 -
 devel-docs/tools/units.c                           |   102 -
 devel-docs/tools/units.h                           |     8 -
 devel-docs/tools/widgets.c                         |   873 --
 devel-docs/tools/widgets.h                         |    25 -
 libgimp/gimppdb.c                                  |    21 +-
 libgimp/gimpplugin.c                               |   156 +-
 libgimp/gimpplugin.h                               |    81 +-
 libgimp/gimpprocedure.c                            |    87 +-
 meson_options.txt                                  |     3 +-
 134 files changed, 546 insertions(+), 25972 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd3bebf977..1f578d72eb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -70,7 +70,8 @@ build-image:
     - echo "FROM debian:testing" > Dockerfile
     - echo "RUN apt-get update" >> Dockerfile
     - echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
-    - echo "at-spi2-core build-essential desktop-file-utils ffmpeg ghostscript git glib-networking 
gobject-introspection graphviz graphviz-dev gtk-doc-tools hicolor-icon-theme intltool iso-codes 
libappstream-glib-dev libbz2-dev libdbus-glib-1-dev libexif-dev libgexiv2-dev libgirepository1.0-dev 
libgtk-3-bin libgtk-3-dev libgudev-1.0-dev libjson-glib-dev liblcms2-dev liblzma-dev libmng-dev 
libmypaint-dev libopenexr-dev libpoppler-glib-dev libraw-dev libraw20 librsvg2-dev libspiro-dev 
libsuitesparse-dev libtiff-dev libtiff5-dev libtool libumfpack5 libwebp-dev libwmf-dev libxmu-dev libxpm-dev 
luajit meson mypaint-brushes poppler-data python3 valac xauth xvfb" >> Dockerfile
+    - echo "at-spi2-core build-essential desktop-file-utils ffmpeg ghostscript git glib-networking 
gobject-introspection graphviz graphviz-dev hicolor-icon-theme intltool iso-codes libappstream-glib-dev 
libbz2-dev libdbus-glib-1-dev libexif-dev libgexiv2-dev libgirepository1.0-dev libgtk-3-bin libgtk-3-dev 
libgudev-1.0-dev libjson-glib-dev liblcms2-dev liblzma-dev libmng-dev libmypaint-dev libopenexr-dev 
libpoppler-glib-dev libraw-dev libraw20 librsvg2-dev libspiro-dev libsuitesparse-dev libtiff-dev libtiff5-dev 
libtool libumfpack5 libwebp-dev libwmf-dev libxmu-dev libxpm-dev luajit meson mypaint-brushes poppler-data 
python3 python3-pip valac xauth xsltproc xvfb" >> Dockerfile
+    - echo "RUN pip3 install gi-docgen jinja2 Markdown markupsafe pygments toml typogrify" >> Dockerfile
 
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination 
$CI_REGISTRY_IMAGE:build-debian-latest --cache=true --cache-ttl=120h
 
@@ -210,7 +211,7 @@ gimp-distcheck-debian:
     - ../autogen.sh
         --prefix="${INSTALL_PREFIX}"
         --enable-debug
-        --enable-gtk-doc
+        --enable-gi-docgen
         --enable-windows-installer
     - make -j "$(nproc)"
     - make -j "$(nproc)" check
@@ -487,7 +488,7 @@ gimp-win64:
     - export PATH="`pwd`/.local/bin:$PATH"
     - mkdir _build && cd _build
     - echo 'crossroad meson ..
-              -Dgtk-doc=false && ninja && ninja install &&
+              -Dgi-docgen=false && ninja && ninja install &&
             cp -fr $CROSSROAD_PREFIX/ ../gimp-prefix/
             ' |
       crossroad w64 gimp --run="-"
@@ -552,7 +553,7 @@ gimp-win32:
     - export PATH="`pwd`/.local/bin:$PATH"
     - mkdir _build && cd _build
     - echo 'crossroad meson ..
-              -Dwmf=disabled  -Dmng=disabled -Dgtk-doc=false && ninja && ninja install &&
+              -Dwmf=disabled  -Dmng=disabled -Dgi_docgen=false && ninja && ninja install &&
             cp -fr $CROSSROAD_PREFIX/ ../gimp-prefix/
             ' |
       crossroad w32 gimp --run="-"
diff --git a/CODING_STYLE.md b/CODING_STYLE.md
index ec265be00f..7094e9cb86 100644
--- a/CODING_STYLE.md
+++ b/CODING_STYLE.md
@@ -645,8 +645,8 @@ which often revamp their design, breaking URLs, etc.).
 #### Public API Documentation
 
 All public APIs (i.e. any function exported in a header inside
-`libgimp*/` folders) **MUST** have proper gtk-doc comments. For
-functions, these should be placed in the source file directly above.
+`libgimp*/` folders) **MUST** have proper GObject-introspection (GIR) comments.
+For functions, these should be placed in the source file directly above.
 
 These annotations are also relevant for [GObject
 Introspection](https://gi.readthedocs.io/en/latest/annotations/giannotations.html)
diff --git a/HACKING b/HACKING
index 004cd2ac61..fb17479186 100644
--- a/HACKING
+++ b/HACKING
@@ -20,9 +20,6 @@ Beta software can be found at alpha.gnu.org.
     * pkg-config 0.16.0 (or preferably a newer version)
         - https://www.freedesktop.org/software/pkgconfig/
 
-    * gtkdocize
-        - https://ftp.gnome.org/pub/GNOME/sources/gtk-doc/
-
     * xsltproc
         - ftp://ftp.gnome.org/pub/GNOME/sources/libxslt/1.1/
 
diff --git a/Makefile.am b/Makefile.am
index 3d22f29089..cdc707f03d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -86,11 +86,10 @@ EXTRA_DIST = \
        authors.xsl             \
        config.h.win32          \
        gimp-zip.in             \
-       git-version.h           \
-       gtk-doc.make
+       git-version.h
 
 
-AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-python=force --with-javascript=force --with-lua=force
+AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gi-docgen --with-python=force --with-javascript=force 
--with-lua=force
 
 
 check-defs:
diff --git a/autogen.sh b/autogen.sh
index eb66aefb59..a7d21d1c9f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -110,35 +110,6 @@ if test x$LIBTOOLIZE != x; then
     check_version $VER $LIBTOOL_REQUIRED_VERSION
 fi
 
-# check if gtk-doc is explicitly disabled
-for ag_option in $AUTOGEN_CONFIGURE_ARGS $@
-do
-  case $ag_option in
-    -disable-gtk-doc | --disable-gtk-doc)
-    enable_gtk_doc=no
-  ;;
-  esac
-done
-
-if test x$enable_gtk_doc = xno; then
-  echo "skipping test for gtkdocize"
-else
-  printf "checking for gtkdocize ... "
-  if (gtkdocize --version) < /dev/null > /dev/null 2>&1; then
-      echo "yes"
-  else
-      echo
-      echo "  You must have gtk-doc installed to compile $PROJECT."
-      echo "  Install the appropriate package for your distribution,"
-      echo "  or get the source tarball at"
-      echo "  https://ftp.gnome.org/pub/GNOME/sources/gtk-doc/";
-      echo "  You can also use the option --disable-gtk-doc to skip"
-      echo "  this test but then you will not be able to generate a"
-      echo "  configure script that can build the API documentation."
-      DIE=1
-  fi
-fi
-
 printf "checking for autoconf >= $AUTOCONF_REQUIRED_VERSION ... "
 if ($AUTOCONF --version) < /dev/null > /dev/null 2>&1; then
     VER=`$AUTOCONF --version | head -n 1 \
@@ -279,19 +250,6 @@ fi
 
 $LIBTOOLIZE --force || exit $?
 
-if test x$enable_gtk_doc = xno; then
-    if test -f gtk-doc.make; then :; else
-       echo "EXTRA_DIST = missing-gtk-doc" > gtk-doc.make
-       echo "CLEANFILES = " >> gtk-doc.make
-    fi
-    echo "WARNING: You have disabled gtk-doc."
-    echo "         As a result, you will not be able to generate the API"
-    echo "         documentation and 'make dist' will not work."
-    echo
-else
-    gtkdocize || exit $?
-fi
-
 # optionally feature autoheader
 ($AUTOHEADER --version)  < /dev/null > /dev/null 2>&1 && $AUTOHEADER || exit 1
 
diff --git a/build/flatpak/org.gimp.GIMP-nightly.json b/build/flatpak/org.gimp.GIMP-nightly.json
index 5025134aaa..ad290b52d8 100644
--- a/build/flatpak/org.gimp.GIMP-nightly.json
+++ b/build/flatpak/org.gimp.GIMP-nightly.json
@@ -36,7 +36,6 @@
         "/share/aclocal",
         "/man",
         "/share/man",
-        "/share/gtk-doc",
         "/share/vala",
         "*.la",
         "*.a"
@@ -802,7 +801,7 @@
         {
             "name": "gimp",
             "config-opts": [
-                "-Dgtk-doc=false",
+                "-Dgi-docgen=false",
                 "-Dicc-directory=/run/host/usr/share/color/icc/",
                 "-Dbuild-id=org.gimp.GIMP.flatpak.nightly",
                 "-Dcheck-update=no"
diff --git a/configure.ac b/configure.ac
index 728859cefc..4751c6fec4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2748,22 +2748,20 @@ if test "x$platform_osx" = "xno" &&
   AC_MSG_RESULT([$with_icc_directory])
 fi
 
-######################################
-# Checks for gtk-doc and docbook-tools
-######################################
+########################################
+# Check for gi-docgen
+########################################
 
-# Check for GTK_DOC_CHECK availability. The GTK_DOC_CHECK invocation
-# must be on its own line, gtkdocize relies on it
-m4_ifdef([GTK_DOC_CHECK], [
-GTK_DOC_CHECK([1.0])
-])
+AC_ARG_ENABLE(gi-docgen, [  --enable-gi-docgen       build gi-docgen documentation (default=yes)], , 
enable_gi_docgen=yes)
 
-# NOTE: We need to use a separate automake conditional for this
-#       to make this work with the tarballs.
-AM_CONDITIONAL(ENABLE_GTK_DOC, test "x$enable_gtk_doc" = xyes)
+if test "x$enable_gi_docgen" = xyes; then
+  AC_PATH_PROG(GI_DOCGEN, gi-docgen, no)
+  if test "x$GI_DOCGEN" = xno; then
+    add_deps_error([gi-docgen], [Could not find gi-docgen in your PATH.])
+  fi
+fi
 
-AC_ARG_ENABLE(gtk-doc-app, [  --enable-gtk-doc-app    build developer documentation for app (default=no)], , 
enable_gtk_doc_app=no)
-AM_CONDITIONAL(ENABLE_GTK_DOC_APP, test "x$enable_gtk_doc_app" = xyes)
+AM_CONDITIONAL(ENABLE_GI_DOCGEN, test "x$enable_gi_docgen" = xyes)
 
 ########################################
 # Checks for gir-doc-tool and yelp-build
@@ -3109,19 +3107,11 @@ plug-ins/twain/Makefile
 plug-ins/common/Makefile
 modules/Makefile
 devel-docs/Makefile
-devel-docs/version
-devel-docs/app/Makefile
 devel-docs/g-ir-docs/Makefile
-devel-docs/libgimp/Makefile
-devel-docs/libgimpbase/Makefile
-devel-docs/libgimpconfig/Makefile
-devel-docs/libgimpcolor/Makefile
-devel-docs/libgimpmath/Makefile
-devel-docs/libgimpmodule/Makefile
-devel-docs/libgimpthumb/Makefile
-devel-docs/libgimpwidgets/Makefile
+devel-docs/reference/Makefile
+devel-docs/reference/gimp-ui/Makefile
+devel-docs/reference/gimp/Makefile
 devel-docs/performance-logs/Makefile
-devel-docs/tools/Makefile
 docs/Makefile
 menus/Makefile
 cursors/Makefile
diff --git a/data/images/meson.build b/data/images/meson.build
index 7ecce25387..a570661cf8 100644
--- a/data/images/meson.build
+++ b/data/images/meson.build
@@ -1,3 +1,4 @@
+gimp_logo_dir = meson.current_source_dir()
 
 images = [
   'gimp-splash.png',
diff --git a/devel-docs/Makefile.am b/devel-docs/Makefile.am
index 8062d27456..bd6d32501e 100644
--- a/devel-docs/Makefile.am
+++ b/devel-docs/Makefile.am
@@ -1,27 +1,13 @@
 ## Process this file with automake to produce Makefile.in
 
-if ENABLE_GTK_DOC_APP
-app = app
-endif
-
 SUBDIRS = \
        g-ir-docs       \
-       tools           \
-       libgimpbase     \
-       libgimpcolor    \
-       libgimpconfig   \
-       libgimpmath     \
-       libgimpmodule   \
-       libgimpthumb    \
-       libgimpwidgets  \
-       libgimp         \
-       $(app)          \
+       reference       \
        \
        performance-logs
 
 EXTRA_DIST = \
        README                          \
-       README.gtkdoc                   \
        contexts.txt                    \
        debug-plug-ins.txt              \
        exif-handling.txt               \
@@ -43,20 +29,3 @@ EXTRA_DIST = \
        vbr.txt                         \
        xcf.txt                         \
        version.in
-
-
-# require gtk-doc when making dist
-#
-if ENABLE_GTK_DOC
-dist-check-gtk-doc:
-if ENABLE_GTK_DOC_APP
-       @echo "*** gtk-doc-app must be disabled in order to make dist"
-       @false
-endif
-else
-dist-check-gtk-doc:
-       @echo "*** gtk-doc must be enabled in order to make dist"
-       @false
-endif
-
-dist-hook: dist-check-gtk-doc
diff --git a/devel-docs/meson.build b/devel-docs/meson.build
index 48919e76c6..4f65f92edb 100644
--- a/devel-docs/meson.build
+++ b/devel-docs/meson.build
@@ -17,20 +17,8 @@ mkdb_args_common = [
 ]
 
 
-if get_option('gtk-doc')
-  if get_option('gtk-doc-app')
-    subdir('app')
-  endif
-
-  subdir('libgimp')
-  subdir('libgimpbase')
-  subdir('libgimpcolor')
-  subdir('libgimpconfig')
-  subdir('libgimpmath')
-  subdir('libgimpmodule')
-  subdir('libgimpthumb')
-  subdir('libgimpwidgets')
-  subdir('tools')
+if get_option('gi-docgen')
+  subdir('reference')
 endif
 
 if get_option('g-ir-doc')
diff --git a/devel-docs/libgimp/.gitignore b/devel-docs/reference/.gitignore
similarity index 100%
rename from devel-docs/libgimp/.gitignore
rename to devel-docs/reference/.gitignore
diff --git a/devel-docs/reference/Makefile.am b/devel-docs/reference/Makefile.am
new file mode 100644
index 0000000000..15a26c3e7a
--- /dev/null
+++ b/devel-docs/reference/Makefile.am
@@ -0,0 +1,7 @@
+## Process this file with automake to produce Makefile.in
+
+if ENABLE_GI_DOCGEN
+
+SUBDIRS = gimp gimp-ui
+
+endif
diff --git a/devel-docs/reference/gimp-ui/Makefile.am b/devel-docs/reference/gimp-ui/Makefile.am
new file mode 100644
index 0000000000..fe3a058bcc
--- /dev/null
+++ b/devel-docs/reference/gimp-ui/Makefile.am
@@ -0,0 +1,26 @@
+## Process this file with automake to produce Makefile.in
+
+GIMP_DOC_LOGO = $(abs_top_srcdir)/data/images/gimp-logo.ong
+
+gimp-ui-3.0.toml: gimp-ui-3.0.toml.in
+       $(AM_V_GEN) sed \
+               -e 's/@GIMP_VERSION[@]/$(GIMP_VERSION)/' \
+               -e 's/@GIMP_LOGO[@]/$(GIMP_DOC_LOGO)/' \
+               $< $@
+
+# Markdown content files
+content_files = \
+       widget-gallery.md \
+       $(NULL)
+
+GimpUi-reference: $(top_builddir)/libgimp/GimpUi-@GIMP_API_VERSION@.gir 
$(top_builddir)/libgimp/Gimp-@GIMP_API_VERSION@.gir $(content_files) gimp-ui-3.0.toml
+       $(GI_DOCGEN) \
+       generate \
+       --quiet \
+       --fatal-warnings \
+       --config=gimp-ui-3.0.toml \
+       --output-dir=$(abs_builddir)/Gimp-3.0 \
+       --no-namespace-dir \
+       --content-dir=$(abs_srcdir) \
+    --add-include-path=$(top_abs_builddir)/gimp \
+       $<
diff --git a/devel-docs/reference/gimp-ui/gimp-ui-3.0.toml.in 
b/devel-docs/reference/gimp-ui/gimp-ui-3.0.toml.in
new file mode 100644
index 0000000000..69a315bacd
--- /dev/null
+++ b/devel-docs/reference/gimp-ui/gimp-ui-3.0.toml.in
@@ -0,0 +1,108 @@
+[library]
+namespace = "GimpUi"
+version = "@GIMP_VERSION@"
+browse_url = "https://gitlab.gnome.org/GNOME/gimp/";
+repository_url = "https://gitlab.gnome.org/GNOME/gimp.git";
+website_url = "https://www.gimp.org";
+authors = "GIMP contributors"
+logo_url = "@GIMP_LOGO@"
+license = "GPL-3.0-or-later"
+description = "GIMP UI library"
+dependencies = [
+  'Babl-0.1',
+  'GLib-2.0',
+  'GObject-2.0',
+  'GdkPixbuf-2.0',
+  'Gegl-0.4',
+  'Gio-2.0',
+  'Gtk-3.0',
+  'cairo-1.0',
+]
+devhelp = true
+search_index = true
+
+  [dependencies."Babl-0.1"]
+  name = "Babl"
+  description = "Pixel encoding and color space conversion engine"
+  docs_url = "https://gegl.org/babl";
+
+  [dependencies."GLib-2.0"]
+  name = "GLib"
+  description = "C Utility Library"
+  docs_url = "https://developer.gnome.org/glib/stable";
+
+  [dependencies."GObject-2.0"]
+  name = "GObject"
+  description = "The base type system library"
+  docs_url = "https://developer.gnome.org/gobject/stable";
+
+  [dependencies."GdkPixbuf-2.0"]
+  name = "GdkPixbuf"
+  description = "Image loading and scaling"
+  docs_url = "https://docs.gtk.org/gdk-pixbuf/";
+
+  [dependencies."Gegl-0.4"]
+  name = "Gegl"
+  description = "Generic Graphics Library"
+  docs_url = "https://gegl.org/";
+
+  [dependencies."Gio-2.0"]
+  name = "Gio"
+  description = "GObject interfaces and objects"
+  docs_url = "https://developer.gnome.org/gio/stable";
+
+  [dependencies."Gtk-3.0"]
+  name = "GTK"
+  description = "The GTK toolkit"
+  docs_url = "https://developer.gnome.org/gtk3/stable";
+
+  [dependencies."cairo-1.0"]
+  name = "Cairo"
+  description = "A 2D graphics library with support for multiple output devices"
+  docs_url = "https://www.cairographics.org/manual/";
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+base_url = "https://gitlab.gnome.org/GNOME/gimp/-/blob/master/";
+
+[extra]
+content_files = [
+  'widget-gallery.md',
+]
+content_images = [
+  'images/browser.png',
+  'images/busy-box.png',
+  'images/button.png',
+  'images/chain-button.png',
+  'images/color-area.png',
+  'images/color-button.png',
+  'images/color-hex-entry.png',
+  'images/color-notebook.png',
+  'images/color-profile-combo-box.png',
+  'images/color-profile-view.png',
+  'images/color-scale.png',
+  'images/color-scales.png',
+  'images/color-select.png',
+  'images/color-selection.png',
+  'images/dialog.png',
+  'images/enum-combo-box.png',
+  'images/enum-label.png',
+  'images/file-entry.png',
+  'images/frame.png',
+  'images/hint-box.png',
+  'images/int-combo-box.png',
+  'images/memsize-entry.png',
+  'images/number-pair-entry.png',
+  'images/offset-area.png',
+  'images/page-selector.png',
+  'images/path-editor.png',
+  'images/pick-button.png',
+  'images/preview-area.png',
+  'images/ruler.png',
+  'images/string-combo-box.png',
+  'images/unit-combo-box.png',
+]
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-browser.png 
b/devel-docs/reference/gimp-ui/images/browser.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-browser.png
rename to devel-docs/reference/gimp-ui/images/browser.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-busy-box.png 
b/devel-docs/reference/gimp-ui/images/busy-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-busy-box.png
rename to devel-docs/reference/gimp-ui/images/busy-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-button.png 
b/devel-docs/reference/gimp-ui/images/button.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-button.png
rename to devel-docs/reference/gimp-ui/images/button.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-chain-button.png 
b/devel-docs/reference/gimp-ui/images/chain-button.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-chain-button.png
rename to devel-docs/reference/gimp-ui/images/chain-button.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-area.png 
b/devel-docs/reference/gimp-ui/images/color-area.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-area.png
rename to devel-docs/reference/gimp-ui/images/color-area.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-button.png 
b/devel-docs/reference/gimp-ui/images/color-button.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-button.png
rename to devel-docs/reference/gimp-ui/images/color-button.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-hex-entry.png 
b/devel-docs/reference/gimp-ui/images/color-hex-entry.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-hex-entry.png
rename to devel-docs/reference/gimp-ui/images/color-hex-entry.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-notebook.png 
b/devel-docs/reference/gimp-ui/images/color-notebook.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-notebook.png
rename to devel-docs/reference/gimp-ui/images/color-notebook.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-profile-combo-box.png 
b/devel-docs/reference/gimp-ui/images/color-profile-combo-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-profile-combo-box.png
rename to devel-docs/reference/gimp-ui/images/color-profile-combo-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-profile-view.png 
b/devel-docs/reference/gimp-ui/images/color-profile-view.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-profile-view.png
rename to devel-docs/reference/gimp-ui/images/color-profile-view.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-scale.png 
b/devel-docs/reference/gimp-ui/images/color-scale.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-scale.png
rename to devel-docs/reference/gimp-ui/images/color-scale.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-scales.png 
b/devel-docs/reference/gimp-ui/images/color-scales.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-scales.png
rename to devel-docs/reference/gimp-ui/images/color-scales.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-select.png 
b/devel-docs/reference/gimp-ui/images/color-select.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-select.png
rename to devel-docs/reference/gimp-ui/images/color-select.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-color-selection.png 
b/devel-docs/reference/gimp-ui/images/color-selection.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-color-selection.png
rename to devel-docs/reference/gimp-ui/images/color-selection.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-dialog.png 
b/devel-docs/reference/gimp-ui/images/dialog.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-dialog.png
rename to devel-docs/reference/gimp-ui/images/dialog.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-enum-combo-box.png 
b/devel-docs/reference/gimp-ui/images/enum-combo-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-enum-combo-box.png
rename to devel-docs/reference/gimp-ui/images/enum-combo-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-enum-label.png 
b/devel-docs/reference/gimp-ui/images/enum-label.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-enum-label.png
rename to devel-docs/reference/gimp-ui/images/enum-label.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-file-entry.png 
b/devel-docs/reference/gimp-ui/images/file-entry.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-file-entry.png
rename to devel-docs/reference/gimp-ui/images/file-entry.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-frame.png 
b/devel-docs/reference/gimp-ui/images/frame.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-frame.png
rename to devel-docs/reference/gimp-ui/images/frame.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-hint-box.png 
b/devel-docs/reference/gimp-ui/images/hint-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-hint-box.png
rename to devel-docs/reference/gimp-ui/images/hint-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-int-combo-box.png 
b/devel-docs/reference/gimp-ui/images/int-combo-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-int-combo-box.png
rename to devel-docs/reference/gimp-ui/images/int-combo-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-memsize-entry.png 
b/devel-docs/reference/gimp-ui/images/memsize-entry.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-memsize-entry.png
rename to devel-docs/reference/gimp-ui/images/memsize-entry.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-number-pair-entry.png 
b/devel-docs/reference/gimp-ui/images/number-pair-entry.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-number-pair-entry.png
rename to devel-docs/reference/gimp-ui/images/number-pair-entry.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-offset-area.png 
b/devel-docs/reference/gimp-ui/images/offset-area.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-offset-area.png
rename to devel-docs/reference/gimp-ui/images/offset-area.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-page-selector.png 
b/devel-docs/reference/gimp-ui/images/page-selector.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-page-selector.png
rename to devel-docs/reference/gimp-ui/images/page-selector.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-path-editor.png 
b/devel-docs/reference/gimp-ui/images/path-editor.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-path-editor.png
rename to devel-docs/reference/gimp-ui/images/path-editor.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-pick-button.png 
b/devel-docs/reference/gimp-ui/images/pick-button.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-pick-button.png
rename to devel-docs/reference/gimp-ui/images/pick-button.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-preview-area.png 
b/devel-docs/reference/gimp-ui/images/preview-area.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-preview-area.png
rename to devel-docs/reference/gimp-ui/images/preview-area.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-ruler.png 
b/devel-docs/reference/gimp-ui/images/ruler.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-ruler.png
rename to devel-docs/reference/gimp-ui/images/ruler.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-string-combo-box.png 
b/devel-docs/reference/gimp-ui/images/string-combo-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-string-combo-box.png
rename to devel-docs/reference/gimp-ui/images/string-combo-box.png
diff --git a/devel-docs/libgimpwidgets/images/gimp-widget-unit-combo-box.png 
b/devel-docs/reference/gimp-ui/images/unit-combo-box.png
similarity index 100%
rename from devel-docs/libgimpwidgets/images/gimp-widget-unit-combo-box.png
rename to devel-docs/reference/gimp-ui/images/unit-combo-box.png
diff --git a/devel-docs/reference/gimp-ui/meson.build b/devel-docs/reference/gimp-ui/meson.build
new file mode 100644
index 0000000000..da1e32f1ea
--- /dev/null
+++ b/devel-docs/reference/gimp-ui/meson.build
@@ -0,0 +1,38 @@
+# Extra markdown files
+gimp_ui_doc_content_files = [
+  'widget-gallery.md',
+]
+
+gimp_ui_doc_toml = configure_file(
+  input: 'gimp-ui-3.0.toml.in',
+  output: '@BASENAME@',
+  configuration: {
+    'GIMP_VERSION': gimp_version,
+    'GIMP_LOGO': gimp_logo_dir / 'gimp-logo.png',
+  },
+)
+
+gimp_ui_docs = custom_target('gimp-ui-docs',
+  input: libgimpui_gir[0],
+  output: 'GimpUi-@0@'.format(gimp_api_version),
+  command: [
+    gi_docgen,
+    'generate',
+    '--quiet',
+    '--fatal-warnings',
+    '--config', gimp_ui_doc_toml,
+    '--output-dir=@OUTPUT@',
+    '--no-namespace-dir',
+    '--content-dir=@0@'.format(meson.current_source_dir()),
+    '--add-include-path=@0@'.format(meson.build_root() / 'libgimp'),
+    '@INPUT@',
+  ],
+  depends: libgimp_gir[0],
+  depend_files: [
+    gimp_ui_doc_toml,
+    gimp_ui_doc_content_files,
+  ],
+  build_by_default: true,
+  install: true,
+  install_dir: get_option('datadir') / 'doc',
+)
diff --git a/devel-docs/reference/gimp-ui/widget-gallery.md b/devel-docs/reference/gimp-ui/widget-gallery.md
new file mode 100644
index 0000000000..b436f2c07a
--- /dev/null
+++ b/devel-docs/reference/gimp-ui/widget-gallery.md
@@ -0,0 +1,36 @@
+Title: Widget gallery
+
+Widget gallery
+==============
+
+[![Browser](browser.png)](class.Browser.html)
+[![Button](button.png)](class.Button.html)
+[![BusyBox](busy-box.png)](class.BusyBox.html)
+[![ChainButton](chain-button.png)](class.ChainButton.html)
+[![ColorArea](color-area.png)](class.ColorArea.html)
+[![ColorButton](color-button.png)](class.ColorButton.html)
+[![ColorHexEntry](color-hex-entry.png)](class.ColorHexEntry.html)
+[![ColorNotebook](color-notebook.png)](class.ColorNotebook.html)
+[![ColorScale](color-scale.png)](class.ColorScale.html)
+[![ColorScales](color-scales.png)](class.ColorScales.html)
+[![ColorSelect](color-select.png)](class.ColorSelect.html)
+[![ColorSelection](color-selection.png)](class.ColorSelection.html)
+[![ColorProfileComboBox](color-profile-combo-box.png)](class.ColorProfileComboBox.html)
+[![ColorProfileView](color-profile-view.png)](class.ColorProfileView.html)
+[![Dialog](dialog.png)](class.Dialog.html)
+[![EnumComboBox](enum-combo-box.png)](class.EnumComboBox.html)
+[![EnumLabel](enum-label.png)](class.EnumLabel.html)
+[![FileEntry](file-entry.png)](class.FileEntry.html)
+[![Frame](frame.png)](class.Frame.html)
+[![HintBox](hint-box.png)](class.HintBox.html)
+[![IntComboBox](int-combo-box.png)](class.IntComboBox.html)
+[![MemsizeEntry](memsize-entry.png)](class.MemsizeEntry.html)
+[![NumberPairEntry](number-pair-entry.png)](class.NumberPairEntry.html)
+[![OffsetArea](offset-area.png)](class.OffsetArea.html)
+[![PageSelector](page-selector.png)](class.PageSelector.html)
+[![PathEditor](path-editor.png)](class.PathEditor.html)
+[![PickButton](pick-button.png)](class.PickButton.html)
+[![PreviewArea](preview-area.png)](class.PreviewArea.html)
+[![Ruler](ruler.png)](class.Ruler.html)
+[![StringComboBox](string-combo-box.png)](class.StringComboBox.html)
+[![UnitComboBox](unit-combo-box.png)](class.UnitComboBox.html)
diff --git a/devel-docs/reference/gimp/Makefile.am b/devel-docs/reference/gimp/Makefile.am
new file mode 100644
index 0000000000..c5bade5445
--- /dev/null
+++ b/devel-docs/reference/gimp/Makefile.am
@@ -0,0 +1,24 @@
+## Process this file with automake to produce Makefile.in
+
+GIMP_DOC_LOGO = $(abs_top_srcdir)/data/images/gimp-logo.ong
+
+gimp-3.0.toml: gimp-3.0.toml.in
+       $(AM_V_GEN) sed \
+               -e 's/@GIMP_VERSION[@]/$(GIMP_VERSION)/' \
+               -e 's/@GIMP_LOGO[@]/$(GIMP_DOC_LOGO)/' \
+               $< $@
+
+# Markdown content files
+content_files = \
+       $(NULL)
+
+Gimp-reference: $(top_builddir)/libgimp/Gimp-@GIMP_API_VERSION@.gir $(content_files) gimp-3.0.toml
+       $(GI_DOCGEN) \
+       generate \
+       --quiet \
+       --fatal-warnings \
+       --config=gimp-3.0.toml \
+       --output-dir=$(abs_builddir)/Gimp-3.0 \
+       --no-namespace-dir \
+       --content-dir=$(abs_srcdir) \
+       $<
diff --git a/devel-docs/reference/gimp/gimp-3.0.toml.in b/devel-docs/reference/gimp/gimp-3.0.toml.in
new file mode 100644
index 0000000000..f25364c830
--- /dev/null
+++ b/devel-docs/reference/gimp/gimp-3.0.toml.in
@@ -0,0 +1,74 @@
+[library]
+namespace = "Gimp"
+version = "@GIMP_VERSION@"
+browse_url = "https://gitlab.gnome.org/GNOME/gimp/";
+repository_url = "https://gitlab.gnome.org/GNOME/gimp.git";
+website_url = "https://www.gimp.org";
+authors = "GIMP contributors"
+logo_url = "@GIMP_LOGO_PATH@"
+license = "GPL-3.0-or-later"
+description = "GIMP library"
+dependencies = [
+  'Babl-0.1',
+  'GLib-2.0',
+  'GObject-2.0',
+  'GdkPixbuf-2.0',
+  'Gegl-0.4',
+  'Gio-2.0',
+  'Gtk-3.0',
+  'cairo-1.0',
+]
+devhelp = true
+search_index = true
+
+  [dependencies."Babl-0.1"]
+  name = "Babl"
+  description = "Pixel encoding and color space conversion engine"
+  docs_url = "https://gegl.org/babl";
+
+  [dependencies."GLib-2.0"]
+  name = "GLib"
+  description = "C Utility Library"
+  docs_url = "https://developer.gnome.org/glib/stable";
+
+  [dependencies."GObject-2.0"]
+  name = "GObject"
+  description = "The base type system library"
+  docs_url = "https://developer.gnome.org/gobject/stable";
+
+  [dependencies."GdkPixbuf-2.0"]
+  name = "GdkPixbuf"
+  description = "Image loading and scaling"
+  docs_url = "https://docs.gtk.org/gdk-pixbuf/";
+
+  [dependencies."Gegl-0.4"]
+  name = "Gegl"
+  description = "Generic Graphics Library"
+  docs_url = "https://gegl.org/";
+
+  [dependencies."Gio-2.0"]
+  name = "Gio"
+  description = "GObject interfaces and objects"
+  docs_url = "https://developer.gnome.org/gio/stable";
+
+  [dependencies."Gtk-3.0"]
+  name = "GTK"
+  description = "The GTK toolkit"
+  docs_url = "https://developer.gnome.org/gtk3/stable";
+
+  [dependencies."cairo-1.0"]
+  name = "Cairo"
+  description = "A 2D graphics library with support for multiple output devices"
+  docs_url = "https://www.cairographics.org/manual/";
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+base_url = "https://gitlab.gnome.org/GNOME/gimp/-/blob/master/";
+
+[extra]
+content_files = [
+]
diff --git a/devel-docs/reference/gimp/meson.build b/devel-docs/reference/gimp/meson.build
new file mode 100644
index 0000000000..aa0af4ac48
--- /dev/null
+++ b/devel-docs/reference/gimp/meson.build
@@ -0,0 +1,35 @@
+# Extra markdown files
+gimp_doc_content_files = [
+]
+
+gimp_doc_toml = configure_file(
+  input: 'gimp-3.0.toml.in',
+  output: '@BASENAME@',
+  configuration: {
+    'GIMP_VERSION': gimp_version,
+    'GIMP_LOGO': gimp_logo_dir / 'gimp-logo.png',
+  },
+)
+
+gimp_docs = custom_target('gimp-docs',
+  input: libgimp_gir[0],
+  output: 'Gimp-@0@'.format(gimp_api_version),
+  command: [
+    gi_docgen,
+    'generate',
+    '--quiet',
+    '--fatal-warnings',
+    '--config', gimp_doc_toml,
+    '--output-dir=@OUTPUT@',
+    '--no-namespace-dir',
+    '--content-dir=@0@'.format(meson.current_source_dir()),
+    '@INPUT@',
+  ],
+  depend_files: [
+    gimp_doc_toml,
+    gimp_doc_content_files,
+  ],
+  build_by_default: true,
+  install: true,
+  install_dir: get_option('datadir') / 'doc',
+)
diff --git a/devel-docs/reference/meson.build b/devel-docs/reference/meson.build
new file mode 100644
index 0000000000..e885a51a21
--- /dev/null
+++ b/devel-docs/reference/meson.build
@@ -0,0 +1,4 @@
+gi_docgen = find_program('gi-docgen')
+
+subdir('gimp')
+subdir('gimp-ui')
diff --git a/libgimp/gimppdb.c b/libgimp/gimppdb.c
index a8c64251c7..2136b67c3f 100644
--- a/libgimp/gimppdb.c
+++ b/libgimp/gimppdb.c
@@ -36,14 +36,10 @@
 
 
 /**
- * SECTION: gimppdb
- * @title: GimpPDB
- * @short_description: Functions for querying and changing procedural
- *                     database (PDB) entries.
+ * GimpPDB:
  *
- * Functions for querying and changing procedural database (PDB)
- * entries.
- **/
+ * Provides access to the Procedural DataBase (PDB).
+ */
 
 
 struct _GimpPDBPrivate
@@ -134,7 +130,7 @@ _gimp_pdb_get_plug_in (GimpPDB *pdb)
 
 /**
  * gimp_pdb_procedure_exists:
- * @pdb:            A #GimpPDB instance.
+ * @pdb:            A PDB instance.
  * @procedure_name: A procedure name
  *
  * This function checks if a procedure exists in the procedural
@@ -159,13 +155,12 @@ gimp_pdb_procedure_exists (GimpPDB     *pdb,
  * @pdb:            A #GimpPDB instance.
  * @procedure_name: A procedure name
  *
- * This function returns the #GimpProcedure which is registered
+ * This function returns the [class@Procedure] which is registered
  * with @procedure_name if it exists, or returns %NULL otherwise.
  *
- * The returned #GimpProcedure is owned by @pdb and must not be
- * modified.
+ * The returned [class@Procedure] is owned by @pdb and must not be modified.
  *
- * Return: (nullable) (transfer none): A #GimpProcedure, or %NULL.
+ * Return: (nullable) (transfer none): A [class@Procedure], or %NULL.
  *
  * Since: 3.0
  **/
@@ -236,7 +231,7 @@ gimp_pdb_run_procedure (GimpPDB     *pdb,
  * @args:           the call arguments.
  *
  * Runs the procedure named @procedure_name with @args given in the
- * order as passed to gimp_pdb_run_procedure().
+ * order as passed to [method@PDB.run_procedure].
  *
  * Returns: (transfer full): the return values for the procedure call.
  *
diff --git a/libgimp/gimpplugin.c b/libgimp/gimpplugin.c
index 86fd4975f4..f3ce17f1bc 100644
--- a/libgimp/gimpplugin.c
+++ b/libgimp/gimpplugin.c
@@ -38,70 +38,62 @@
 
 
 /**
- * SECTION: gimpplugin
- * @title: GimpPlugIn
- * @short_description: The base class for plug-ins to derive from
+ * GimpPlugIn:
  *
- * The base class for plug-ins to derive from. #GimpPlugIn manages the
- * plug-in's #GimpProcedure objects. The procedures a plug-in
- * implements are registered with GIMP by returning a #GList of their
- * names from either #GimpPlugInClass.query_procedures() or
- * #GimpPlugInClass.init_procedures().
+ * The base class for plug-ins to derive from.
  *
- * Every GIMP plug-in has to implement a #GimpPlugIn subclass and make
- * it known to the libgimp infrastructure and the main GIMP
- * application by passing its #GType to GIMP_MAIN().
+ * GimpPlugIn manages the plug-in's [class@Procedure] objects. The procedures a
+ * plug-in implements are registered with GIMP by returning a list of their
+ * names from either [vfunc@GimpPlugIn.query_procedures] or
+ * [vfunc@GimpPlugIn.init_procedures].
  *
- * GIMP_MAIN() passes the 'argc' and 'argv' of the platform's main()
- * function, along with the #GType, to gimp_main(), which creates an
- * instance of the plug-in's #GimpPlugIn subclass and calls its
- * virtual functions, depending on how the plug-in was called by GIMP.
+ * Every GIMP plug-in has to be implemented as a subclass and make it known to
+ * the libgimp infrastructure and the main GIMP application by passing its
+ * `GType` to [func@MAIN].
  *
- * There are three different ways GIMP calls a plug-in, "query",
- * "init" and "run".
+ * [func@MAIN] passes the 'argc' and 'argv' of the platform's main() function,
+ * along with the `GType`, to [func@main], which creates an instance of the
+ * plug-in's `GimpPlugIn` subclass and calls its virtual functions, depending
+ * on how the plug-in was called by GIMP.
  *
- * The plug-in is called in "query" mode once after it was installed,
- * or when the cached plug-in information in the config file
- * "pluginrc" needs to be recreated. In "query" mode,
- * #GimpPlugInClass.query_procedures() is called and returns a #GList
- * of procedure names the plug-in implements. This is the "normal"
- * place to register procedures, because the existence of most
- * procedures doesn't depend on things that change between GIMP
- * sessions.
+ * There are 3 different ways GIMP calls a plug-in: "query", "init" and "run".
+ *
+ * The plug-in is called in "query" mode once after it was installed, or when
+ * the cached plug-in information in the config file "pluginrc" needs to be
+ * recreated. In "query" mode, [vfunc@GimpPlugIn.query_procedures] is called
+ * and returns a list of procedure names the plug-in implements. This is the
+ * "normal" place to register procedures, because the existence of most
+ * procedures doesn't depend on things that change between GIMP sessions.
  *
  * The plug-in is called in "init" mode at each GIMP startup, and
- * #GimpPlugInClass.init_procedures() is called and returns a #GList
- * of procedure names this plug-in implements. This only happens if
- * the plug-in actually implements
- * #GimpPlugInClass.init_procedures(). A plug-in only needs to
- * implement #GimpPlugInClass.init_procedures() if the existence of
- * its procedures can change between GIMP sessions, for example if
- * they depend on the presence of external tools, or hardware like
- * scanners, or online services, or whatever variable circumstances.
+ * [vfunc@PlugIn.init_procedures] is called and returns a list of procedure
+ * names this plug-in implements. This only happens if the plug-in actually
+ * implements [vfunc@GimpPlugIn.init_procedures]. A plug-in only needs to
+ * implement init_procedures if the existence of its procedures can change
+ * between GIMP sessions, for example if they depend on the presence of
+ * external tools, or hardware like scanners, or online services, or whatever
+ * variable circumstances.
  *
- * In order to register the plug-in's procedures with the main GIMP
- * application in the plug-in's "query" and "init" modes, #GimpPlugIn
- * calls #GimpPlugInClass.create_procedure() on all procedure names in
- * the exact order of the #GList returned by
- * #GimpPlugInClass.query_procedures() or
- * #GimpPlugInClass.init_procedures() and then registers the returned
- * #GimpProcedure using #GimpProcedureClass.register().
+ * In order to register the plug-in's procedures with the main GIMP application
+ * in the plug-in's "query" and "init" modes, [class@PlugIn] calls
+ * [vfunc@PlugIn.create_procedure] on all procedure names in the exact order of
+ * the list returned by [vfunc@PlugIn.query_procedures] or
+ * [vfunc@PlugIn.init_procedures] and then registers the returned
+ * [class@Procedure].
  *
- * The plug-in is called in "run" mode whenever one of the procedures
- * it implements is called by either the main GIMP application or any
- * other plug-in. In "run" mode, one of the procedure names returned
- * by #GimpPlugInClass.query_procedures() or
- * #GimpPlugInClass.init_procedures() is passed to
- * #GimpPlugInClass.create_procedure() which must return a
- * #GimpProcedure for the passed name. The procedure is then executed
- * by calling gimp_procedure_run().
+ * The plug-in is called in "run" mode whenever one of the procedures it
+ * implements is called by either the main GIMP application or any other
+ * plug-in. In "run" mode, one of the procedure names returned by
+ * [vfunc@PlugIn.query_procedures] or [vfunc@PlugIn.init_procedures] is passed
+ * to [vfunc@PlugIn.create_procedure] which must return a [class@Procedure] for
+ * the passed name. The procedure is then executed by calling
+ * [method Procedure run].
  *
- * In any of the three modes, #GimpPlugInClass.quit() is called before
- * the plug-in process exits, so the plug-in can perform whatever
- * cleanup necessary.
+ * In any of the three modes, [vfunc PlugIn quit] is called before the plug-in
+ * process exits, so the plug-in can perform whatever cleanup necessary.
  *
  * Since: 3.0
- **/
+ */
 
 
 #define WRITE_BUFFER_SIZE 1024
@@ -230,6 +222,11 @@ gimp_plug_in_class_init (GimpPlugInClass *klass)
   object_class->set_property = gimp_plug_in_set_property;
   object_class->get_property = gimp_plug_in_get_property;
 
+  /**
+   * GimpPlugIn:read-channel:
+   *
+   * The [struct@GLib.IOChannel] to read from GIMP
+   */
   props[PROP_READ_CHANNEL] =
     g_param_spec_boxed ("read-channel",
                         "Read channel",
@@ -238,6 +235,11 @@ gimp_plug_in_class_init (GimpPlugInClass *klass)
                         GIMP_PARAM_READWRITE |
                         G_PARAM_CONSTRUCT_ONLY);
 
+  /**
+   * GimpPlugIn:write-channel:
+   *
+   * The [struct@GLib.IOChannel] to write to GIMP
+   */
   props[PROP_WRITE_CHANNEL] =
     g_param_spec_boxed ("write-channel",
                         "Write channel",
@@ -378,7 +380,7 @@ gimp_plug_in_get_property (GObject    *object,
  * gimp_plug_in_set_translation_domain:
  * @plug_in:     A #GimpPlugIn.
  * @domain_name: The name of the textdomain (must be unique).
- * @domain_path: (nullable): A #GFile pointing to the compiled message catalog
+ * @domain_path: (nullable): A file pointing to the compiled message catalog
  *               (may be %NULL).
  *
  * Sets a textdomain for localisation for the @plug_in.
@@ -392,7 +394,7 @@ gimp_plug_in_get_property (GObject    *object,
  * location.
  *
  * This function can only be called in the
- * #GimpPlugInClass.query_procedures() function of a plug-in.
+ * [vfunc@PlugIn.query_procedures] function of a plug-in.
  *
  * Since: 3.0
  **/
@@ -420,13 +422,13 @@ gimp_plug_in_set_translation_domain (GimpPlugIn  *plug_in,
  * Set a help domain and path for the @plug_in.
  *
  * This function registers user documentation for the calling plug-in
- * with the GIMP help system. The domain_uri parameter points to the
+ * with the GIMP help system. The @domain_uri parameter points to the
  * root directory where the plug-in help is installed. For each
  * supported language there should be a file called 'gimp-help.xml'
  * that maps the help IDs to the actual help files.
  *
  * This function can only be called in the
- * #GimpPlugInClass.query_procedures() function of a plug-in.
+ * [vfunc@PlugIn.query_procedures] function of a plug-in.
  *
  * Since: 3.0
  **/
@@ -492,19 +494,19 @@ gimp_plug_in_add_menu_branch (GimpPlugIn  *plug_in,
  *
  * This function adds a temporary procedure to @plug_in. It is usually
  * called from a %GIMP_PDB_PROC_TYPE_EXTENSION procedure's
- * #GimpProcedureClass.run().
+ * [vfunc Procedure run].
  *
  * A temporary procedure is a procedure which is only available while
  * one of your plug-in's "real" procedures is running.
  *
- * The procedure's type <emphasis>must</emphasis> be
+ * The procedure's type _must_ be
  * %GIMP_PDB_PROC_TYPE_TEMPORARY or the function will fail.
  *
  * NOTE: Normally, plug-in communication is triggered by the plug-in
  * and the GIMP core only responds to the plug-in's requests. You must
  * explicitly enable receiving of temporary procedure run requests
- * using either gimp_plug_in_extension_enable() or
- * gimp_plug_in_extension_process(). See this functions' documentation
+ * using either [method@PlugIn.extension_enable] or
+ * [method@PlugIn.extension_process]. See their respective documentation
  * for details.
  *
  * Since: 3.0
@@ -528,7 +530,7 @@ gimp_plug_in_add_temp_procedure (GimpPlugIn    *plug_in,
 /**
  * gimp_plug_in_remove_temp_procedure:
  * @plug_in:        A #GimpPlugIn
- * @procedure_name: The name of a #GimpProcedure added to @plug_in.
+ * @procedure_name: The name of a [class@Procedure] added to @plug_in.
  *
  * This function removes a temporary procedure from @plug_in by the
  * procedure's @procedure_name.
@@ -559,10 +561,10 @@ gimp_plug_in_remove_temp_procedure (GimpPlugIn  *plug_in,
 
 /**
  * gimp_plug_in_get_temp_procedures:
- * @plug_in: A #GimpPlugIn
+ * @plug_in: A plug-in
  *
  * This function retrieves the list of temporary procedure of @plug_in as
- * added with gimp_plug_in_add_temp_procedure().
+ * added with [method@PlugIn.add_temp_procedure].
  *
  * Returns: (transfer none) (element-type GimpProcedure): The list of
  *          procedures.
@@ -580,7 +582,7 @@ gimp_plug_in_get_temp_procedures (GimpPlugIn *plug_in)
 /**
  * gimp_plug_in_get_temp_procedure:
  * @plug_in:        A #GimpPlugIn
- * @procedure_name: The name of a #GimpProcedure added to @plug_in.
+ * @procedure_name: The name of a [class@Procedure] added to @plug_in.
  *
  * This function retrieves a temporary procedure from @plug_in by the
  * procedure's @procedure_name.
@@ -611,7 +613,7 @@ gimp_plug_in_get_temp_procedure (GimpPlugIn  *plug_in,
 
 /**
  * gimp_plug_in_extension_enable:
- * @plug_in: A #GimpPlugIn
+ * @plug_in: A plug-in
  *
  * Enables asynchronous processing of messages from the main GIMP
  * application.
@@ -622,18 +624,18 @@ gimp_plug_in_get_temp_procedure (GimpPlugIn  *plug_in,
  * plug-in are just answers to requests the plug-in made.
  *
  * If the plug-in however registered temporary procedures using
- * gimp_plug_in_add_temp_procedure(), it needs to be able to receive
+ * [method@PlugIn.add_temp_procedure], it needs to be able to receive
  * requests to execute them. Usually this will be done by running
- * gimp_plug_in_extension_process() in an endless loop.
+ * [method@PlugIn.extension_process] in an endless loop.
  *
- * If the plug-in cannot use gimp_plug_in_extension_process(), i.e. if
- * it has a GUI and is hanging around in a #GMainLoop, it must call
- * gimp_plug_in_extension_enable().
+ * If the plug-in cannot use [method@PlugIn.extension_process], i.e. if
+ * it has a GUI and is hanging around in a [class@GLib.MainLoop], it must call
+ * [method@PlugIn.extension_enable].
  *
  * Note that the plug-in does not need to be a
- * #GIMP_PDB_PROC_TYPE_EXTENSION to register temporary procedures.
+ * [const@PDBProcType.EXTENSION] to register temporary procedures.
  *
- * See also: gimp_plug_in_add_temp_procedure().
+ * See also: [method@PlugIn.add_temp_procedure].
  *
  * Since: 3.0
  **/
@@ -653,7 +655,7 @@ gimp_plug_in_extension_enable (GimpPlugIn *plug_in)
 
 /**
  * gimp_plug_in_extension_process:
- * @plug_in: A #GimpPlugIn.
+ * @plug_in: A plug-in.
  * @timeout: The timeout (in ms) to use for the select() call.
  *
  * Processes one message sent by GIMP and returns.
@@ -662,10 +664,10 @@ gimp_plug_in_extension_enable (GimpPlugIn *plug_in)
  * gimp_procedure_extension_ready() to process requests for running
  * temporary procedures.
  *
- * See gimp_plug_in_extension_enable() for an asynchronous way of
+ * See [method@PlugIn.extension_enable] for an asynchronous way of
  * doing the same if running an endless loop is not an option.
  *
- * See also: gimp_plug_in_add_temp_procedure().
+ * See also: [method@PlugIn.add_temp_procedure].
  *
  * Since: 3.0
  **/
@@ -736,7 +738,7 @@ gimp_plug_in_extension_process (GimpPlugIn *plug_in,
 
 /**
  * gimp_plug_in_set_pdb_error_handler:
- * @plug_in: A #GimpPlugIn
+ * @plug_in: A plug-in
  * @handler: Who is responsible for handling procedure call errors.
  *
  * Sets an error handler for procedure calls.
@@ -763,7 +765,7 @@ gimp_plug_in_set_pdb_error_handler (GimpPlugIn          *plug_in,
 
 /**
  * gimp_plug_in_get_pdb_error_handler:
- * @plug_in: A #GimpPlugIn
+ * @plug_in: A plug-in
  *
  * Retrieves the active error handler for procedure calls.
  *
diff --git a/libgimp/gimpplugin.h b/libgimp/gimpplugin.h
index 9cc9c521a0..14f20a8849 100644
--- a/libgimp/gimpplugin.h
+++ b/libgimp/gimpplugin.h
@@ -53,41 +53,10 @@ struct _GimpPlugIn
 
 /**
  * GimpPlugInClass:
- * @query_procedures: This method can be overridden by all plug-ins to
- *   return a newly allocated #GList of allocated strings naming the
- *   procedures registered by this plug-in. See documentation of
- *   #GimpPlugInClass.init_procedures() for differences.
- * @init_procedures: This method can be overridden by all plug-ins to
- *   return a newly allocated #GList of allocated strings naming
- *   procedures registered by this plug-in.
- *   It is different from #GimpPlugInClass.query_procedures() in that
- *   init happens at every startup, whereas query happens only once in
- *   the life of a plug-in (right after installation or update). Hence
- *   #GimpPlugInClass.init_procedures() typically returns procedures
- *   dependent to runtime conditions (such as the presence of a
- *   third-party tool), whereas #GimpPlugInClass.query_procedures()
- *   would usually return procedures that are always available
- *   unconditionally.
- *   Most of the time, you only want to override
- *   #GimpPlugInClass.query_procedures() and leave
- *   #GimpPlugInClass.init_procedures() untouched.
- * @create_procedure: This method must be overridden by all plug-ins
- *   and return a newly allocated #GimpProcedure named @name. It will
- *   be called for every @name as returned by
- *   #GimpPlugInClass.query_procedures() and
- *   #GimpPlugInClass.init_procedures() so care must be taken to
- *   handle them all.
- *   Upon procedure registration, #GimpPlugInClass.create_procedure()
- *   will be called in the order of the lists returned by
- *   #GimpPlugInClass.query_procedures() and
- *   #GimpPlugInClass.init_procedures()
- * @quit: This method can be overridden by a plug-in which needs to
- *   perform some actions upon quitting.
  *
  * A class which every plug-in should subclass, while overriding
- * #GimpPlugInClass.query_procedures() and/or
- * #GimpPlugInClass.init_procedures(), as well as
- * #GimpPlugInClass.create_procedure().
+ * [vfunc@PlugIn.query_procedures] and/or [vfunc@PlugIn.init_procedures], as
+ * well as [vfunc@PlugIn.create_procedure].
  *
  * Since: 3.0
  **/
@@ -99,17 +68,33 @@ struct _GimpPlugInClass
    * GimpPlugInClass::query_procedures:
    * @plug_in: a #GimpPlugIn.
    *
-   * Returns: (element-type gchar*) (transfer full):
-   *          the names of the procedures registered by @plug_in.
-   **/
+   * This method can be overridden by all plug-ins to return a newly allocated
+   * list of allocated strings naming the procedures registered by this
+   * plug-in. See documentation of [vfunc@PlugIn.init_procedures] for
+   * differences.
+   *
+   * Returns: (element-type gchar*) (transfer full): the names of the procedures registered by @plug_in.
+   */
   GList          * (* query_procedures) (GimpPlugIn  *plug_in);
 
   /**
    * GimpPlugInClass::init_procedures:
    * @plug_in: a #GimpPlugIn.
    *
-   * Returns: (element-type gchar*) (transfer full):
-   *          the names of the procedures registered by @plug_in.
+   * This method can be overridden by all plug-ins to return a newly allocated
+   * list of allocated strings naming procedures registered by this plug-in.
+   * It is different from [vfunc@PlugIn.query_procedures] in that init happens
+   * at every startup, whereas query happens only once in the life of a plug-in
+   * (right after installation or update). Hence [vfunc@PlugIn.init_procedures]
+   * typically returns procedures dependent to runtime conditions (such as the
+   * presence of a third-party tool), whereas [vfunc@PlugIn.query_procedures]
+   * would usually return procedures that are always available unconditionally.
+   *
+   * Most of the time, you only want to override
+   * [vfunc@PlugIn.query_procedures] and leave [vfunc@PlugIn.init_procedures]
+   * untouched.
+   *
+   * Returns: (element-type gchar*) (transfer full): the names of the procedures registered by @plug_in.
    **/
   GList          * (* init_procedures)  (GimpPlugIn  *plug_in);
 
@@ -118,16 +103,28 @@ struct _GimpPlugInClass
    * @plug_in:        a #GimpPlugIn.
    * @procedure_name: procedure name.
    *
-   * Returns: (transfer full):
-   *          the procedure to be registered or executed by @plug_in.
-   **/
+   * This method must be overridden by all plug-ins and return a newly
+   * allocated #GimpProcedure named @name.
+   *
+   * This method will be called for every @name as returned by
+   * [vfunc@PlugIn.query_procedures] and [vfunc@PlugIn.init_procedures] so care
+   * must be taken to handle them all.  Upon procedure registration,
+   * [vfunc@PlugIn.create_procedure] will be called in the order of the lists
+   * returned by [vfunc@PlugIn.query_procedures] and
+   * [vfunc@PlugIn.init_procedures]
+   *
+   * Returns: (transfer full): the procedure to be registered or executed by @plug_in.
+   */
   GimpProcedure  * (* create_procedure) (GimpPlugIn  *plug_in,
                                          const gchar *procedure_name);
 
   /**
    * GimpPlugInClass::quit:
    * @plug_in: a #GimpPlugIn.
-   **/
+   *
+   * This method can be overridden by a plug-in which needs to perform some
+   * actions upon quitting.
+   */
   void             (* quit)             (GimpPlugIn  *plug_in);
 
   /* Padding for future expansion */
diff --git a/libgimp/gimpprocedure.c b/libgimp/gimpprocedure.c
index af6aacc70d..6219a1a7d6 100644
--- a/libgimp/gimpprocedure.c
+++ b/libgimp/gimpprocedure.c
@@ -554,13 +554,13 @@ gimp_procedure_real_create_config (GimpProcedure  *procedure,
  * Using %GIMP_PDB_PROC_TYPE_EXTENSION means that the plug-in will add
  * temporary procedures. Therefore, the GIMP core will wait until the
  * %GIMP_PDB_PROC_TYPE_EXTENSION procedure has called
- * gimp_procedure_extension_ready(), which means that the procedure
+ * [method@Procedure.extension_ready], which means that the procedure
  * has done its initialization, installed its temporary procedures and
  * is ready to run.
  *
- * <emphasis>Not calling gimp_procedure_extension_ready() from a
+ * *Not calling [method@Procedure.extension_ready] from a
  * %GIMP_PDB_PROC_TYPE_EXTENSION procedure will cause the GIMP core to
- * lock up.</emphasis>
+ * lock up.*
  *
  * Additionally, a %GIMP_PDB_PROC_TYPE_EXTENSION procedure with no
  * arguments added is an "automatic" extension that will be
@@ -568,9 +568,9 @@ gimp_procedure_real_create_config (GimpProcedure  *procedure,
  *
  * %GIMP_PDB_PROC_TYPE_TEMPORARY must be used for temporary procedures
  * that are created during a plug-ins lifetime. They must be added to
- * the #GimpPlugIn using gimp_plug_in_add_temp_procedure().
+ * the #GimpPlugIn using [method@PlugIn.add_temp_procedure].
  *
- * @run_func is called via gimp_procedure_run().
+ * @run_func is called via [method Procedure run].
  *
  * For %GIMP_PDB_PROC_TYPE_PLUGIN and %GIMP_PDB_PROC_TYPE_EXTENSION
  * procedures the call of @run_func is basically the lifetime of the
@@ -612,7 +612,7 @@ gimp_procedure_new (GimpPlugIn      *plug_in,
  * gimp_procedure_get_plug_in:
  * @procedure: A #GimpProcedure.
  *
- * Returns: (transfer none): The #GimpPlugIn given in gimp_procedure_new().
+ * Returns: (transfer none): The #GimpPlugIn given in [ctor Procedure new].
  *
  * Since: 3.0
  **/
@@ -628,7 +628,7 @@ gimp_procedure_get_plug_in (GimpProcedure *procedure)
  * gimp_procedure_get_name:
  * @procedure: A #GimpProcedure.
  *
- * Returns: The procedure's name given in gimp_procedure_new().
+ * Returns: The procedure's name given in [ctor Procedure new].
  *
  * Since: 3.0
  **/
@@ -644,7 +644,7 @@ gimp_procedure_get_name (GimpProcedure *procedure)
  * gimp_procedure_get_proc_type:
  * @procedure: A #GimpProcedure.
  *
- * Returns: The procedure's type given in gimp_procedure_new().
+ * Returns: The procedure's type given in [ctor Procedure new].
  *
  * Since: 3.0
  **/
@@ -719,7 +719,7 @@ gimp_procedure_get_image_types (GimpProcedure *procedure)
  * suitable error message.
  *
  * Similarly third-party plug-ins should verify they are allowed to call
- * a procedure with gimp_procedure_get_sensitivity_mask() when running
+ * a procedure with [method@Procedure.get_sensitivity_mask] when running
  * with dynamic contents.
  *
  * Note that by default, a procedure works on an image with a single
@@ -756,7 +756,7 @@ gimp_procedure_set_sensitivity_mask (GimpProcedure *procedure,
  * @procedure: A #GimpProcedure.
  *
  * Returns: The procedure's sensitivity mask given in
- *          gimp_procedure_set_sensitivity_mask().
+ *          [method@Procedure.set_sensitivity_mask].
  *
  * Since: 3.0
  **/
@@ -825,13 +825,7 @@ gimp_procedure_get_menu_label (GimpProcedure *procedure)
  * label can add a menu path.
  *
  * Menu paths are untranslated paths to menus and submenus with the
- * syntax:
- *
- * &lt;Prefix&gt;/Path/To/Submenu
- *
- * for instance:
- *
- * &lt;Image&gt;/Layer/Transform
+ * syntax `<Prefix>/Path/To/Submenu`, for example `<Image>/Layer/Transform`
  *
  * See also: gimp_plug_in_add_menu_branch().
  *
@@ -938,7 +932,7 @@ gimp_procedure_set_icon_file (GimpProcedure *procedure,
  *
  * Gets the type of data set as @procedure's icon. Depending on the
  * result, you can call the relevant specific function, such as
- * gimp_procedure_get_icon_name().
+ * [method@Procedure.get_icon_name].
  *
  * Returns: the #GimpIconType of @procedure's icon.
  *
@@ -1068,7 +1062,7 @@ gimp_procedure_set_documentation (GimpProcedure *procedure,
  * @procedure: A #GimpProcedure.
  *
  * Returns: The procedure's blurb given in
- *          gimp_procedure_set_documentation().
+ * [method@Procedure.set_documentation].
  *
  * Since: 3.0
  **/
@@ -1085,7 +1079,7 @@ gimp_procedure_get_blurb (GimpProcedure *procedure)
  * @procedure: A #GimpProcedure.
  *
  * Returns: The procedure's help text given in
- *          gimp_procedure_set_documentation().
+ * [method@Procedure.set_documentation].
  *
  * Since: 3.0
  **/
@@ -1102,7 +1096,7 @@ gimp_procedure_get_help (GimpProcedure *procedure)
  * @procedure: A #GimpProcedure.
  *
  * Returns: The procedure's help ID given in
- *          gimp_procedure_set_documentation().
+ * [method@Procedure.set_documentation].
  *
  * Since: 3.0
  **/
@@ -1152,8 +1146,7 @@ gimp_procedure_set_attribution (GimpProcedure *procedure,
  * gimp_procedure_get_authors:
  * @procedure: A #GimpProcedure.
  *
- * Returns: The procedure's authors given in
- *          gimp_procedure_set_attribution().
+ * Returns: The procedure's authors given in [method@Procedure.set_attribution].
  *
  * Since: 3.0
  **/
@@ -1170,7 +1163,7 @@ gimp_procedure_get_authors (GimpProcedure *procedure)
  * @procedure: A #GimpProcedure.
  *
  * Returns: The procedure's copyright given in
- *          gimp_procedure_set_attribution().
+ * [method@Procedure.set_attribution].
  *
  * Since: 3.0
  **/
@@ -1186,8 +1179,7 @@ gimp_procedure_get_copyright (GimpProcedure *procedure)
  * gimp_procedure_get_date:
  * @procedure: A #GimpProcedure.
  *
- * Returns: The procedure's date given in
- *          gimp_procedure_set_attribution().
+ * Returns: The procedure's date given in [method@Procedure.set_attribution].
  *
  * Since: 3.0
  **/
@@ -1206,11 +1198,11 @@ gimp_procedure_get_date (GimpProcedure *procedure)
  *
  * Add a new argument to @procedure according to @pspec specifications.
  * The arguments will be ordered according to the call order to
- * gimp_procedure_add_argument() and
- * gimp_procedure_add_argument_from_property().
+ * [method@Procedure.add_argument] and
+ * [method@Procedure.add_argument_from_property].
  *
  * If @pspec is floating, ownership will be taken over by @procedure,
- * allowing to pass directly g*_param_spec_*() calls as arguments.
+ * allowing to pass directly `g*_param_spec_*()` calls as arguments.
  *
  * Returns: (transfer none): the same @pspec or %NULL in case of error.
  *
@@ -1264,7 +1256,7 @@ gimp_procedure_add_argument (GimpProcedure *procedure,
  * Add a new argument to @procedure according to the specifications of
  * the property @prop_name registered on @config.
  *
- * See gimp_procedure_add_argument() for details.
+ * See [method@Procedure.add_argument] for details.
  *
  * Returns: (transfer none): the added #GParamSpec.
  *
@@ -1385,8 +1377,8 @@ gimp_procedure_add_aux_argument_from_property (GimpProcedure *procedure,
  * specifications.
  *
  * The returned values will be ordered according to the call order to
- * gimp_procedure_add_return_value() and
- * gimp_procedure_add_return_value_from_property().
+ * [method@Procedure.add_return_value] and
+ * [method@Procedure.add_return_value_from_property].
  *
  * Returns: (transfer none): the same @pspec.
  *
@@ -1430,8 +1422,8 @@ gimp_procedure_add_return_value (GimpProcedure *procedure,
  * the property @prop_name registered on @config.
  *
  * The returned values will be ordered according to the call order to
- * gimp_procedure_add_return_value() and
- * gimp_procedure_add_return_value_from_property().
+ * [method@Procedure.add_return_value] and
+ * [method@Procedure.add_return_value_from_property].
  *
  * Returns: (transfer none): the added #GParamSpec.
  *
@@ -1548,7 +1540,7 @@ gimp_procedure_find_return_value (GimpProcedure *procedure,
  *
  * Returns: (transfer none) (array length=n_arguments): An array
  *          of @GParamSpec in the order added with
- *          gimp_procedure_add_argument().
+ *          [method@Procedure.add_argument].
  *
  * Since: 3.0
  **/
@@ -1594,7 +1586,7 @@ gimp_procedure_get_aux_arguments (GimpProcedure *procedure,
  *
  * Returns: (transfer none) (array length=n_return_values): An array
  *          of @GParamSpec in the order added with
- *          gimp_procedure_add_return_value().
+ *          [method@Procedure.add_return_value].
  *
  * Since: 3.0
  **/
@@ -1702,7 +1694,7 @@ gimp_procedure_get_argument_sync (GimpProcedure *procedure,
  * @procedure: the #GimpProcedure.
  *
  * Format the expected argument values of procedures, in the order as
- * added with gimp_procedure_add_argument().
+ * added with [method@Procedure.add_argument].
  *
  * Returns: (transfer full): the expected #GimpValueArray which could be given as
  *          arguments to run @procedure, with all values set to
@@ -1736,7 +1728,7 @@ gimp_procedure_new_arguments (GimpProcedure *procedure)
 
 /**
  * gimp_procedure_new_return_values:
- * @procedure: the #GimpProcedure.
+ * @procedure: the procedure.
  * @status:    the success status of the procedure run.
  * @error:     (in) (nullable) (transfer full):
  *             an optional #GError. This parameter should be set if
@@ -1744,10 +1736,10 @@ gimp_procedure_new_arguments (GimpProcedure *procedure)
  *             #GIMP_PDB_CALLING_ERROR.
  *
  * Format the expected return values from procedures, using the return
- * values set with gimp_procedure_add_return_value().
+ * values set with [method@Procedure.add_return_value].
  *
- * Returns: (transfer full): the expected #GimpValueArray as could be returned by a
- *          #GimpRunFunc.
+ * Returns: (transfer full): the expected #GimpValueArray as could be returned
+ * by a [callback@RunFunc].
  *
  * Since: 3.0
  **/
@@ -1818,7 +1810,7 @@ gimp_procedure_new_return_values (GimpProcedure     *procedure,
  * @procedure: a @GimpProcedure.
  * @args:      the @procedure's arguments.
  *
- * Runs the procedure, calling the run_func given in gimp_procedure_new().
+ * Runs the procedure, calling the run_func given in [ctor Procedure new].
  *
  * Returns: (transfer full): The @procedure's return values.
  *
@@ -1930,15 +1922,14 @@ gimp_procedure_run (GimpProcedure  *procedure,
  * Notify the main GIMP application that the extension has been
  * properly initialized and is ready to run.
  *
- * This function <emphasis>must</emphasis> be called from every
- * procedure's #GimpRunFunc that was created as
- * #GIMP_PDB_PROC_TYPE_EXTENSION.
+ * This function _must_ be called from every procedure's [callback@RunFunc]
+ * that was created as #GIMP_PDB_PROC_TYPE_EXTENSION.
  *
  * Subsequently, extensions can process temporary procedure run
- * requests using either gimp_plug_in_extension_enable() or
- * gimp_plug_in_extension_process().
+ * requests using either [method@PlugIn.extension_enable] or
+ * [method@PlugIn.extension_process].
  *
- * See also: gimp_procedure_new().
+ * See also: [ctor Procedure new].
  *
  * Since: 3.0
  **/
diff --git a/meson_options.txt b/meson_options.txt
index f603708756..94f620a399 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -51,8 +51,7 @@ option('xcursor',           type: 'feature', value: 'auto', description: 'Xcurso
 option('xpm',               type: 'feature', value: 'auto', description: 'XPM support')
 option('headless-tests',    type: 'feature', value: 'auto', description: 'Use xvfb-run/dbus-run-session for 
UI-dependent automatic tests')
 
-option('gtk-doc',           type: 'boolean', value: true,   description: 'Build developer documentation')
-option('gtk-doc-app',       type: 'boolean', value: false,  description: 'Build developer documentation for 
app')
+option('gi-docgen',         type: 'boolean', value: true,   description: 'Build developer documentation 
(uses gi-docgen)')
 option('g-ir-doc',          type: 'boolean', value: false,  description: 'Build developer documentation for 
introspected API')
 
 option('linux-input',       type: 'feature', value: 'auto', description: 'Linux input event controller 
module')


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]