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, with some plugins in Python. 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 be frightened but – don't panic – it's just some C/GObject boilerplate
code, and 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-technology.github.io/).

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).

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).

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.
