Saving settings for extensions

Geert Janssens geert.gnucash at
Sat May 23 05:16:06 EDT 2015

On Monday 11 May 2015 10:29:17 Christoph Holtermann wrote:
> Dear developers,
> I have been wondering for some while if it is possible
> for extensions like in the python bindings to save settings
> in the place gnucash does.
> regards,
> Christoph Holtermann

Hi Christoph,

That's a short question which requires a long answer.

To start there are several places where gnucash stores settings 
depending on the scope of these settings.

Settings that affect all the user's books are stored via the gsettings 
mechanism (which has different backends depending on the OS).

Settings that are related to a book are stored in a file in 
.gnucash/books. These settings mostly save gui state so as such they may 
be of less interest.

The gsettings interface is wrapped via the gnc_prefs api in gnucash. The 
gnc_prefs api is described here:

Via this api it should be relatively easy to read or modify any setting 
that is defined in the gnucash code.

And there's the catch. Only settings that are defined can easily be 
manipulated. That's a limitation of the underlying gsettings interface.

Nothing however is stopping you from defining your own set of 
preferences in an extension written using the python bindings. It will 
likely be more complicated to write such an extension, mainly due to the 
way gsettings works.

New preference options are defined as a "schema" in an xml file. You 
will find several such schema files in the gnucash source tree in the 
various gchemas directories (for example: src/gnome-utils/gschemas).

This schema file then has to be compiled and installed in a place where 
the gsettings library can find it. If you don't want to or can't install 
the compiled schema in the system libraries, you can also install it in 
a non-standard location and set the XDG_DATA_DIRS environment variable 
properly so your schema file will be found. GnuCash uses this mechanism 
itself when it's configured to be installed in a directory other than 
the default (/usr/bin). An example can be found in 
$PREFIX/etc/gnucash/environment in such a case. Note that this file is 
not using shell script notation, so if you want to set the environment 
variable, you will have to transliterate the example (; -> : and adding 
$ signs for inclusion of other environment variables).

So depending on the build system surrounding your python extension, 
wanting to use the gnc preferences system suddenly adds quite a bit of 
overhead. I have no idea if gsettings has some useful python bindings 
itself that may simplify this.

The above is a rough overview only. If you need more details or 
specifics feel free to ask.



More information about the gnucash-devel mailing list