[Geany-Devel] A direction for Geany

Matthew Brush mbrush at xxxxx
Mon Nov 11 09:31:35 UTC 2013


On 13-11-10 11:18 PM, Lex Trotman wrote:
> Hi All,
>
> Recently there have been a number of proposals for significant changes in
> Geany, different languages, GObjectification and other various changes.
>
> As good or bad as the individual suggestions may be, they have made it
> clear to me that there is no plan for the future of Geany that allows them
> to be evaluated effectively.
>
> So I am starting this thread to try to get ideas on where Geany should be
> headed.
>
> To start the ball rolling, here are some of the things I see Geany should
> aspire to:
>
> 1. An architecture that allows multi-threading to be used for non-GUI
> tasks.  The most obvious of course is parsing.  At the moment none of the
> parsers support symbols in anything other than the global scope, and adding
> them would significantly increase the parsing effort, but doing it in a
> background thread would make the performance hit less obvious.  But there
> needs to be a careful design of the passing of data from the edit buffer to
> the parser and back to the symbol tables to minimise overhead, latency and
> ensure its non blocking.  With such an architecture other complex
> functionality can then also happen in the background without impacting
> Geany's responsive feel.
>

Another (perhaps more obvious) candidate here is file loading/saving, 
which is *way* easier than the parsing stuff since we don't have to 
contend with TM/CTags that uses global state like mad, and because 
Scintilla and GIO make this quite easy (probably wouldn't even require 
threads but just mainloop/async stuff).

> 2. Language specific assistance, such as indentation, or dynamic error
> marking and intelligent autocompletes.  I consider that these hang off the
> previous capability of better parsing/analysis of the program.  Matthew has
> demonstrated a prototype that provides some of these facilities using
> libclang (for the clang languages only C, C++, Obj-c).  But the current
> Geany architecture does not support plugging such things in easily, and
> with the number of languages that Geany supports, I would suggest that its
> small, light and fast tag would be severely threatened if assistance for
> all languages were plugged in at once.
>

A way for plugins to "handle" certain filetypes so that plugins can be 
loaded/unloaded as a filetype is used in a document and unload when no 
documents currently use it or something. This could include ability to 
disable or augment certain built-in filetype-specific stuff that can't 
easily be done currently.

> 3. Proper portability.  At the moment Geany is really a Linux application
> that has some limited (and buggy) support for Windows.  The main editing
> widget that Geany uses is available for many platforms and toolkits.  If
> Geany had an architecture that separated the target specific parts into a
> "backend" the way Scintilla does, then it would be possible to support
> multiple targets more easily, making Geany less at the mercy of one
> toolkit's direction (that means you deprecating GTK) and better able to
> support different platforms like OSX and Windows.  Work such as that
> Dimitar is doing for spawning on Windows naturally then falls into such a
> backend.
>

I agree that's a good way to do it, like Chrome, Firefox, LibreOffice, 
etc. to have own wrapper over various toolkits for internal use 
depending on the platform, but IMO, it's vastly too much work for Geany, 
and GTK+ isn't actually all that bad (despite their sometimes 
confounding API changes/deprecations).

The other way we could go is to just strive to be a proper, modern GTK+ 
application. By this I mean using stuff like GtkApplication, 
GtkApplicationWindow, GSettings, etc. The GTK+ stack has lots of cool 
stuff to make doing applications easier/better that we don't use because 
of the ever-present restriction about needing to be able to support LTS 
distros with old GTK2 and not wanting to "GObjectify" and/or make large 
changes to the code.

> 4. Multiple top level windows.  As monitors are cheaper, being able to
> spread views of files to optimally utilise the screen space available adds
> to the users effectiveness.  Most languages support multiple modules in
> different files and many use multiple files for related parts, such as
> C/C++ header and body.  Looking at and editing several places/files at once
> has many uses.  As useful as splitwindows one and two are (especially
> together) they still assume a single rectangular top level is available for
> subdivision.  But different desktop menu layouts or having other
> applications visible at the same time can limit the contiguous rectangular
> space available.  Multiple top levels can make better use of
> non-rectangular space.
>

As with with my comment in #3, if the application was structured as the 
GUI toolkit is designed to be used, using some of the more modern GTK+ 
APIs, this is ridiculously easy, especially when used with the #5 I'm 
going to add:

5. Drop Scintilla and use GtkSourceView. I'll just enumerate the reasons 
that come to mind, in no particular order:

* Scintilla is a big fat not-really-GTK+ C++ library
* We have to keep a fork up-to-date in our source tree
* It provides one of worst APIs known to man, and causes us to have all 
kinds of wrappers to make the API normal and to have our code still 
littered with unsafe SSM() calls that make the code really weird.
* Limited functionality to support plugins participating in the 
buffer/view; for example there's only a really small number of 
indicators, markers, pixmaps, etc. It's not really built with arbitrary 
extension (ex. by plugins) in mind.
* It makes simple things like MVC hard to do with the way its user API 
is so view-centric.
* While it supports background loading, it doesn't support 
background/async lexing, and so completely blocks the UI for huge documents.
* Writing lexers is beyond complicated. Having to write C++ code to 
add/customize syntax highlighting is insane from a user POV.
* Has no builtin support for colour schemes making us have to have a 
whole, kind of confusing, configuration file system to provide it ourselves.
* Reduce Geany's binary size since the editor component would be linked 
dynamically, and not statically like Scintilla is. I don't know if this 
actually matters but I think Scintilla with all the lexers and stuff I 
think it can end up as several MB in the binary.
* As with above, and the one about updating the fork; using a 
dynamically linked version allows the system admin to upgrade their 
libraries and they'll automatically be used by Geany.
* Drop dependency on a C++ compiler. This isn't a big deal really. And 
of course replace with a new dependency on gtksourceview library.
* GtkSourceView provides convenient features like SourceCompletion and 
SourceMarks and such that would make doing stuff from plugins quite 
straightforward.
* GtkSourceView completely integrates into our GUI toolkit, using native 
(not custom drawn like Scintilla) widgets inside and interacts properly 
with stuff like scrolling, focus, DnD, key-bindings, etc.
* If we ever do use GObject stuff more and/or make the plugin API 
automatically bindable with GObject-Introspection, GtkSourceView already 
provides the .gir stuff needed.
* I think GtkSourceView is installed by default usually with at least 
GNOME and XFCE (via Gedit and Mousepad using it and being the "default" 
text editors).

And I since we're mentioning huge changes :)  ...

6. Automatically-bindable plugin API that we officially support for 
multiple languages. Writing plugins in C is crap, IMO. Writing a GeanyPy 
or GeanyLua plugin is kind of crap, because they depend on other 
plugins, and you can't make a "real" first-class plugin with them. 
LibPeas and Gobject-Introspection are the obvious possibility here, but 
would require to "GObjectify" the code pretty much.

> These are all big changes that don't fall into the current Geany mode of
> "light maintenance and extra features as someone implements them".  For big
> changes like those above however, a clear design and a planned process is
> needed to ensure that the big changes don't clash with each other and that
> they are not derailed by interim smaller changes.
>
> I would suggest the process to be:
>
> 1. gather other major ideas for capabilities that Geany should plan to
> support

I just plopped #5 and #6 on to the list, wherever it ends up :)

> 2. develop a design that supports these (or at least the most useful ones)
> 3. look at how that design can be implemented, can the existing design be
> mutated to it, or is it a clean framework that large parts of the existing
> functionality can plug into, or is it a whole clean implementation.  This
> also includes issues like languages to use (C, C++, Vala, Haskell etc).
> 4. depending on the outcome from 3. use a new repository organisation or at
> least a new branch in the existing Geany repo to ensure that the existing
> Geany is not destabilised by major changes as they take place.
>

Yeah, some are quite huge changes, we couldn't be tip-toeing around 
trying not to touch too many lines of code or breaking config file or 
plugin APIs and stuff in the main branch as usual :) I think a separate 
branch on the main repository, as mentioned, would make the most sense.

> This is something very different to the way Geany is currently operating,
> and I don't know if the community wants to consider such a more structured
> approach.  If its felt that its worthwhile then I suggest that steps one
> and two are best achieved using the wiki and I will volunteer to set up and
> maintain page(s) for those phases at least.
>
> So to summarise, what capabilities should Geany aspire to support, and what
> is the process to develop the best software architecture to support those
> capabilities.
>

I'm in/+1, if in doing so we fully adopt GObject/GTK+ and the 
normal/common/modern ways to do stuff using them. I'm not really 
interested to turn Geany into a non-GTK+ app or maintain separate 
backends or continue using painful old non-GObject C stuff, always 
having to avoid a lot of good APIs just for the sake of old supported 
build platforms and library versions. I'm willing to volunteer a 
considerable amount of time to helping out with it in the above case, 
and at least see where it goes, otherwise I'll just be a good tester of 
the re-design/branch :)

Cheers,
Matthew Brush


More information about the Devel mailing list