Como posso instalar um esquema Gsettings sem privilégios de root?

14

O fluxo de trabalho típico para instalar um esquema Gsettings é o seguinte:

  1. Crie um esquema, com a extensão .gschema.xml, com conteúdos como este:

    <?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. Copie o esquema para /usr/share/glib-2.0/schemas/.

  3. Compile o esquema executando este comando:

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

No entanto, gravar em /usr/share/glib-2.0/schemas/requer privilégios de root. Existe uma maneira de instalar um esquema em um diretório de usuários não global?

Flimm
fonte

Respostas:

16

Você pode copiar e compilar seus esquemas Gsettings em um diretório gravável pelo usuário:

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

A parte complicada é configurar o aplicativo para usar esse diretório específico. Existem duas maneiras de fazer isso:

  • Com a GSETTINGS_SCHEMA_DIRvariável de ambiente:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • Ou usando os objetos GSettingsSchemaSource e GSettingSchema:

    Se você tiver acesso ao código fonte do seu programa, poderá modificá-lo para carregar esquemas compilados de qualquer diretório. Aqui está como o faria em Python, embora você possa fazer isso em qualquer linguagem de programação com a introspecção 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)

Referências:

Flimm
fonte
Você também sabe como verificar se um determinado esquema já está instalado (e faça o descrito acima apenas se não estiver)?
Pietro Battiston
De acordo com esses documentos, você também pode adicionar o diretório que contém o glib-2.0/schemasdiretório à XDG_DATA_DIRSvariável de ambiente.
Ntc2