Comment puis-je installer un schéma Gsettings sans privilèges root?

14

Le flux de travail typique pour installer un schéma Gsettings est le suivant:

  1. Créez un schéma, avec l'extension .gschema.xml, avec un contenu comme celui-ci:

    <?xml version="1.0" encoding="UTF-8"?>
    <schemalist>
      <schema id="com.companyname.appname" path="/com/companyname/appname/">
          <key type="b" name="mybool">
              <default>false</default>
              <summary>Example summary</summary>
              <description>Example description</description>
          </key>
      </schema>
    </schemalist>
  2. Copiez le schéma dans /usr/share/glib-2.0/schemas/.

  3. Compilez le schéma en exécutant cette commande:

    sudo glib-compile-schemas /usr/share/glib-2.0/schemas/

Cependant, l'écriture dans /usr/share/glib-2.0/schemas/nécessite des privilèges root. Existe-t-il un moyen d'installer un schéma dans un répertoire utilisateur non global?

Flimm
la source

Réponses:

16

Vous pouvez copier et compiler vos schémas Gsettings dans un répertoire accessible en écriture à l'utilisateur:

$ cp com.companyname.appname ~/schemas/
$ glib-compile-schemas ~/schemas/

L'astuce consiste à configurer l'application pour utiliser ce répertoire particulier. Il y a deux façons de faire ça:

  • Avec la GSETTINGS_SCHEMA_DIRvariable d'environnement:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • Ou en utilisant les objets GSettingsSchemaSource et GSettingSchema:

    Si vous avez accès au code source de votre programme, vous pouvez le modifier pour charger des schémas compilés à partir de n'importe quel répertoire. Voici comment procéder en Python, bien que vous puissiez le faire dans n'importe quel langage de programmation avec introspection GObject:

    schema_source = Gio.SettingsSchemaSource.new_from_directory(
        os.path.expanduser("~/schemas"),
        Gio.SettingsSchemaSource.get_default(),
        False,
    )
    schema = schema_source.lookup('com.companyname.appname', False)
    settings = Gio.Settings.new_full(schema, None, None)
    settings.set_boolean('mybool', True)

Les références:

Flimm
la source
Savez-vous également comment vérifier si un schéma donné est déjà installé (et faire ce qui précède uniquement s'il ne l'est pas)?
Pietro Battiston
Selon ces documents, vous pouvez également ajouter le répertoire contenant le glib-2.0/schemasrépertoire à la XDG_DATA_DIRSvariable d'environnement.
ntc2