¿Cómo puedo instalar un esquema de Gsettings sin privilegios de root?

14

El flujo de trabajo típico para instalar un esquema de Gsettings es el siguiente:

  1. Cree un esquema, con la extensión .gschema.xml, con contenidos 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 el esquema a /usr/share/glib-2.0/schemas/.

  3. Compile el esquema ejecutando este comando:

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

Sin embargo, escribir en /usr/share/glib-2.0/schemas/requiere privilegios de root. ¿Hay alguna manera de instalar un esquema en un directorio de usuarios no global?

Flimm
fuente

Respuestas:

16

Puede copiar y compilar sus esquemas de Gsettings en un directorio de escritura del usuario:

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

El truco es configurar la aplicación para usar ese directorio en particular. Hay dos maneras de hacer esto:

  • Con la GSETTINGS_SCHEMA_DIRvariable de entorno:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • O usando los objetos GSettingsSchemaSource y GSettingSchema:

    Si tiene acceso al código fuente de su programa, puede modificarlo para cargar esquemas compilados desde cualquier directorio. Así es como lo haría en Python, aunque podría hacerlo en cualquier lenguaje de programación con la introspección 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)

Referencias

Flimm
fuente
¿También sabe cómo verificar si un esquema dado ya está instalado (y hacer lo anterior solo si no lo está)?
Pietro Battiston
De acuerdo con estos documentos , también puede agregar el directorio que contiene el glib-2.0/schemasdirectorio a la XDG_DATA_DIRSvariable de entorno.
ntc2