[Geany-Devel] [FT-plugins] Proposed Design

Matthew Brush mbrush at xxxxx
Wed Aug 31 00:54:30 UTC 2016

On 2016-08-30 06:29 AM, Colomban Wendling wrote:
> Le 29/08/2016 à 03:09, Matthew Brush a écrit :
>> On 2016-08-28 05:47 PM, Matthew Brush wrote:
>>> [...]
>>> To give an idea, the registration function called by plugins might look
>>> something like this:
>>>     gboolean ftplugin_register_provider(GeanyPlugin*,
>>>         GeanyFiletypeID, GeanyFiletypeFeature, GCallback, gpointer);
>>> [...]
>> I forgot to mention, it may turn out that in order to provide a feature,
>> there may be a need for multiple callbacks (ex. activate, deactivate,
>> init_styles, prepare_list, whatever). If this ends up being the case, we
>> would need to either pass a table of callbacks here or perhaps a GObject
>> implementing a particular interface or whatever.
> Then probably better make the provide a structure like
> GeanyAutoCompleteProvider {
> 	GeanyFiletypeID filetype;
> 	GCallback feature1;
> 	...
> }

As long as it's uniform across all features (ie. all or none are using 
structs whether or not they have multiple features), that's pretty much 
what I had in mind, and is basically how I represented the internal 
tracking structures in my experimental code I was playing with.

API-wise I find it neater to keep the parameterization in the parameters 
list and keep any structures like that as simple vtables, but the 
difference is rather minute (probably whatever would work better for 
auto-binding generators to read).

> In theory I have nothing against GInterface, but I'm not quite sure it's
> a good idea to start riddling Geany with GObject API where we already
> have like 2 non-GObject-ish API styles (plugin registration, Proxy
> registration, signals…)
> Not saying GInterface is a presona non-grata, but that IMO it would have
> to prove very useful over the other solutions to be used.  Especially as
> people are likely to implement these filetype features in C or C++ more
> than Python, JavaScript or Ruby, so it should be comfortable in C and
> C++, and you know you don't like GObject boilerplate :)

I personally believe interfaces/abstract-bases to be the most 
appropriate technical solution (at least from OOP-languages) at our 
disposal, but I chose to stay away from that mostly to avoid the 
social/political/emotional ramifications of it on the discussion. 
Besides, re-implementing a small portion of it isn't that big a deal and 
doesn't feel so unnatural for C.

Matthew Brush

More information about the Devel mailing list