gedit development - getting started
===================================

The following explanations can be improved over time, if you see something
missing, a feedback is welcome.

Programming languages and paradigms
-----------------------------------

gedit is mostly written in C. The [Meson](https://mesonbuild.com/) build system
is used.

The code is object-oriented and event-driven. In C, it's thanks to the use of
the GObject library (see next section). If you open some `*.c` or `*.h` files,
you may come across some GObject boilerplate code; don't panic, that
boilerplate can be generated by a tool. So once you've learned GObject, you
will no longer be afraid ;-)

Libraries used
--------------

As every GNOME application, gedit uses the GLib, GObject and GTK libraries. To
modify the gedit source code, you should be familiar with those libraries. See
the [GTK website](https://www.gtk.org/) and
[The GLib/GTK Development Platform – A Getting Started Guide](https://github.com/gdev-technology/glib-gtk-learning).

The main "text area" in gedit is a GtkTextView widget. This widget is part of
GTK. You can learn it with the
[GtkTextView tutorial](http://www.bravegnu.org/gtktext/). The tutorial is a bit
old but the GtkTextView API has not changed a lot. (By the way, contributing to
update the tutorial would be a useful task!).

GtkTextView provides the basis, and is extended by other libraries to add more
features. See [Gedit Technology](https://gedit-text-editor.org/technology.html).

For its plugin system, gedit uses
[libpeas](https://wiki.gnome.org/Projects/Libpeas).

Plugins may have other dependencies, for example the spell-checking plugin uses
[gspell](https://gitlab.gnome.org/GNOME/gspell).

gedit architecture
------------------

The [gedit git repository](https://gitlab.gnome.org/World/gedit/gedit) contains:
- The "gedit core" in the `gedit/` directory.
- The default plugins in `plugins/`.

There is also the
[gedit-plugins git repository](https://gitlab.gnome.org/World/gedit/gedit-plugins)
for additional official plugins.

The gedit core provides:
- A basic text editor.
- The integration of libpeas, with an API for plugins.

There is a class diagram of gedit core in the file
[class-diagram.dia](class-diagram.dia) (but it may be outdated, see the Git log
for that file).

Build/Installation
------------------

See the file [build.md](build.md).

Guidelines
----------

See the `docs/guidelines/` directory.

How to write a plugin
---------------------

See the file [how-to-write-a-gedit-plugin.md](how-to-write-a-gedit-plugin.md).

Suggestions
-----------

A good way to learn a lot of things is to write a new plugin (it can be a
third-party plugin at first).

Sometimes a plugin is removed from the gedit or gedit-plugins git repository
because it is unmaintained and broken. Anyone can of course take the source code
and bring a second life to that plugin, in an external repository.

Improving the API reference of the gedit core would be useful, because some
parts lack proper documentation.

A potentially easy task is to fix compilation warnings, for example when a
deprecated function is used. If you encounter a runtime warning or critical
message, it is also a good idea to fix it.

Note that gedit is an old piece of software. Some parts are legacy code and
would benefit from some refactoring.

You can also choose a specific source file and become the new expert in that
area of the codebase.

In all cases, we want to hear from you. Contact the maintainer(s), we can help
you help us ;-)
