the opposite since it forces you to do forward declaration
How is that a negative vs including an entire header that is not needed?
if the file uses a symbol defined in a header, it should include it. Manually introducing forward declarations should IMO be left to breaking circular dependencies alone.
The point of including headers explicitly per-file is to reduce dependencies on source files. Otherwise we would have geany.h include all headers itself.
We already use forward struct declarations in many headers, most of them are not private structs:
``` $ grep -E 'struct \w+;' src/*.h src/editor.h:37:struct GeanyDocument; src/filetypes.h:38:struct GeanyDocument; src/geanyentryaction.h:42:struct _GeanyEntryActionPrivate; src/geanymenubuttonaction.h:42:struct _GeanyMenubuttonActionPrivate; src/keyfile.h:36:struct StashGroup; src/pluginutils.h:34:struct GeanyPlugin; src/pluginutils.h:35:struct GeanyDocument; src/search.h:87:struct GeanyDocument; /* document.h includes this header */ src/search.h:88:struct _ScintillaObject; src/search.h:89:struct Sci_TextToFind; src/templates.h:57:struct filetype; ```