  <chapter>
    <title>Migrating from GConf to GSettings</title>

    <section>
      <title>Before you start</title>

      <para>
        Converting individual applications and their settings from GConf to
        GSettings can be done at will. But desktop-wide settings like font or
        theme settings often have consumers in multiple modules. Therefore,
        some consideration has to go into making sure that all users of a setting
        are converted to GSettings at the same time or that the program
        responsible for configuring that setting continues to update the value in
        both places.
      </para>
      <para>
        It is always a good idea to have a look at how others have handled
        similar problems before.
      </para>
    </section>

    <section>
      <title>Conceptual differences</title>

      <para>
        Conceptually, GConf and GSettings are fairly similar. Both
        have a concept of pluggable backends. Both keep information
        about keys and their types in schemas. Both have a concept of
        mandatory values, which lets you implement lock-down.
      </para>
      <para>
        There are some differences in the approach to schemas. GConf
        installs the schemas into the database and has API to handle
        schema information (gconf_client_get_default_from_schema(),
        gconf_value_get_schema(), etc). GSettings on the other hand
        assumes that an application knows its own schemas, and does
        not provide API to handle schema information at runtime.
        GSettings is also more strict about requiring a schema whenever
        you want to read or write a key. To deal with more free-form
        information that would appear in schema-less entries in GConf,
        GSettings allows for schemas to be 'relocatable'.
      </para>
      <para>
        One difference in the way applications interact with their
        settings is that with GConf you interact with a tree of
        settings (ie the keys you pass to functions when reading
        or writing values are actually paths with the actual name
        of the key as the last element. With GSettings, you create
        a GSettings object which has an implicit prefix that determines
        where the settings get stored in the global tree of settings,
        but the keys you pass when reading or writing values are just
        the key names, not the full path.
      </para>
    </section>

    <section>
      <title>GConfClient (and GConfBridge) API conversion</title>

      <para>
        Most people use GConf via the high-level #GConfClient API.
        The corresponding API is the #GSettings object. While not
        every GConfClient function has a direct GSettings equivalent,
        many do:
        <table id="gconf-client-vs-gsettings">
          <tgroup cols="2">
            <thead>
              <row><entry>GConfClient</entry><entry>GSettings</entry></row>
            </thead>
            <tbody>
              <row><entry>gconf_client_get_default()</entry><entry>no direct equivalent,
                                                                   instead you call g_settings_new() for the schemas you use</entry></row>
              <row><entry>gconf_client_set()</entry><entry>g_settings_set()</entry></row>
              <row><entry>gconf_client_get()</entry><entry>g_settings_get()</entry></row>
              <row><entry>gconf_client_get_bool()</entry><entry>g_settings_get_boolean()</entry></row>
              <row><entry>gconf_client_set_bool()</entry><entry>g_settings_set_boolean()</entry></row>
              <row><entry>gconf_client_get_int()</entry><entry>g_settings_get_int()</entry></row>
              <row><entry>gconf_client_set_int()</entry><entry>g_settings_set_int()</entry></row>
              <row><entry>gconf_client_get_float()</entry><entry>g_settings_get_double()</entry></row>
              <row><entry>gconf_client_set_float()</entry><entry>g_settings_set_double()</entry></row>
              <row><entry>gconf_client_get_string()</entry><entry>g_settings_get_string()</entry></row>
              <row><entry>gconf_client_set_string()</entry><entry>g_settings_set_string()</entry></row>
              <row><entry>gconf_client_get_list()</entry><entry>for string lists, see g_settings_get_strv(), else see g_settings_get_value() and #GVariant API</entry></row>
              <row><entry>gconf_client_set_list()</entry><entry>for string lists, see g_settings_set_strv(), else see g_settings_set_value() and #GVariant API</entry></row>
              <row><entry>gconf_entry_get_is_writable()</entry><entry>g_settings_is_writable()</entry></row>
              <row><entry>gconf_client_notify_add()</entry><entry>not required, the #GSettings::changed signal is emitted automatically</entry></row>
              <row><entry>gconf_client_add_dir()</entry><entry>not required, each GSettings instance automatically watches all keys in its path</entry></row>
              <row><entry>#GConfChangeSet</entry><entry>g_settings_delay(), g_settings_apply()</entry></row>
              <row><entry>gconf_client_get_default_from_schema()</entry><entry>no equivalent, applications are expected to know their schema</entry></row>
              <row><entry>gconf_client_all_entries()</entry><entry>no equivalent, applications are expected to know their schema, and GSettings does not allow schema-less entries</entry></row>
              <row><entry>gconf_client_get_without_default()</entry><entry>no equivalent</entry></row>
              <row><entry>gconf_bridge_bind_property()</entry><entry>g_settings_bind()</entry></row>
              <row><entry>gconf_bridge_bind_property_full()</entry><entry>g_settings_bind_with_mapping()</entry></row>
            </tbody>
          </tgroup>
        </table>
      </para>
      <para>
        GConfBridge was a third-party library that used GConf to bind an object property
        to a particular configuration key. GSettings offers this service itself.
      </para>
      <para>
        There is a pattern that is sometimes used for GConf, where a setting can have
        explicit 'value A', explicit 'value B' or 'use the system default'. With GConf,
        'use the system default' is sometimes implemented by unsetting the user value.
      </para>
      <para>
        This is not possible in GSettings, since it does not have API to determine if a value
        is the default and does not let you unset values. The recommended way (and much
        clearer) way in which this can be implemented in GSettings is to have a separate
        'use-system-default' boolean setting.
      </para>
    </section>

    <section>
      <title>Change notification</title>

      <para>
        GConf requires you to call gconf_client_add_dir() and
        gconf_client_notify_add() to get change notification. With
        GSettings, this is not necessary; signals get emitted automatically
        for every change.
      </para>
      <para>
        The #GSettings::changed signal is emitted for each changed key.
        There is also a #GSettings::change-event signal that you can handle
        if you need to see groups of keys that get changed at the same time.
      </para>
      <para>
        GSettings also notifies you about changes in writability of keys,
        with the #GSettings::writable-changed signal (and the
        #GSettings::writable-change-event signal).
      </para>
    </section>

    <section><title>Change sets</title>
      <para>
        GConf has a a concept of a set of changes which can be applied or reverted
        at once: #GConfChangeSet (GConf doesn't actually apply changes atomically,
        which is one of its shortcomings).
      </para>
      <para>
        Instead of a separate object to represent a change set, GSettings has a
        'delayed-apply' mode, which can be turned on for a GSettings object by
        calling g_settings_delay(). In this mode, changes done to the GSettings
        object are not applied - they are still visible when calling g_settings_get()
        <emphasis>on the same object</emphasis>, but not to other GSettings instances
        or even other processes.
      </para>
      <para>
        To apply the pending changes all at once (GSettings <emphasis>does</emphasis>
        atomicity here), call g_settings_apply(). To revert the pending changes,
        call g_settings_revert() or just drop the reference to the #GSettings object.
      </para>
    </section>

    <section>
      <title>Schema conversion</title>

      <para>
        If you are porting your application from GConf, most likely you already
        have a GConf schema. GConf comes with a commandline tool
        gsettings-schema-convert that can help with the task of converting
        a GConf schema into an equivalent GSettings schema. The tool is not
        perfect and may need assistence in some cases.
      </para>
      <example><title>An example for using gsettings-schema-convert</title>
        <para>Running <userinput>gsettings-schema-convert --gconf --xml --schema-id "org.gnome.font-rendering" --output org.gnome.font-rendering.gschema.xml destop_gnome_font_rendering.schemas</userinput> on the following <filename>desktop_gnome_font_rendering.schemas</filename> file:
        <programlisting>
<![CDATA[
<?xml version="1.0"?>
<gconfschemafile>
    <schemalist>
        <schema>
            <key>/schemas/desktop/gnome/font_rendering/dpi</key>
            <applyto>/desktop/gnome/font_rendering/dpi</applyto>
            <owner>gnome</owner>
            <type>int</type>
            <default>96</default>
            <locale name="C">
                <short>DPI</short>
                <long>The resolution used for converting font sizes to pixel sizes, in dots per inch.</long>
            </locale>
        </schema>
    </schemalist>
</gconfschemafile>
]]>
</programlisting>
produces a <filename>org.gnome.font-rendering.gschema.xml</filename> file with the following content:
<programlisting>
<![CDATA[
<schemalist>
  <schema id="org.gnome.font-rendering" path="/desktop/gnome/font_rendering/">
    <key name="dpi" type="i">
      <default>96</default>
      <summary>DPI</summary>
      <description>The resolution used for converting font sizes to pixel sizes, in dots per inch.</description>
    </key>
  </schema>
</schemalist>
]]>
</programlisting>
</para>
      </example>

      <para>
       GSettings schemas are identified at runtime by their id (as specified
       in the XML source file). It is recommended to use a dotted name as schema
       id, similar in style to a D-Bus bus name, e.g. "org.gnome.SessionManager".
       In cases where the settings are general and not specific to one application,
       the id should not use StudlyCaps, e.g. "org.gnome.font-rendering".
       The filename used for the XML schema source is immaterial, but
       schema compiler expects the files to have the extension
       <filename>.gschema.xml</filename>. It is recommended to simply
       use the schema id as the filename, followed by this extension,
       e.g. <filename>org.gnome.SessionManager.gschema.xml</filename>.
      </para>

      <para>
        The XML source file for your GSettings schema needs to get installed
        into <filename>$datadir/glib-2.0/schemas</filename>, and needs to be
        compiled into a binary form. At runtime, GSettings looks for compiled
        schemas in the <filename>glib-2.0/schemas</filename> subdirectories
        of all <envar>XDG_DATA_DIRS</envar> directories, so if you install
        your schema in a different location, you need to set the
        <envar>XDG_DATA_DIRS</envar> environment variable appropriately.
      </para>
      <para>
        Schemas are compiled into binary form by the
        <link linkend="glib-compile-schemas">glib-compile-schemas</link> utility.
        GIO provides a <literal>glib_compile_schemas</literal>
        variable for the schema compiler.
      </para>
      <para>
        You can ignore all of this by using the provided m4 macros.  To
        do this, add to your <filename>configure.ac</filename>:
<programlisting>
GLIB_GSETTINGS
</programlisting>
        The corresponding <filename>Makefile.am</filename> fragment looks like
        this:
<programlisting>
# gsettings_SCHEMAS is a list of all the schemas you want to install
gsettings_SCHEMAS = my.app.gschema.xml

# include the appropriate makefile rules for schema handling
@GSETTINGS_RULES@
</programlisting>
      </para>

      <para>
        This is not sufficient on its own.  You need to mention what the source
        of the <filename>my.app.gschema.xml</filename> file is.  If the schema
        file is distributed directly with your project's tarball then a mention
        in <varname>EXTRA_DIST</varname> is appropriate.  If the schema file is
        generated from another source then you will need the appropriate rule
        for that, plus probably an item in <varname>EXTRA_DIST</varname> for the
        source files used by that rule.
      </para>

      <para>
        One possible pitfall in doing schema conversion is that the default
        values in GSettings schemas are parsed by the #GVariant parser.
        This means that strings need to include quotes in the XML.  Also note
        that the types are now specified as #GVariant type strings.
        <programlisting>
<![CDATA[
<type>string</type>
<default>rgb</default>
]]>
        </programlisting>
        becomes
        <programlisting>
<![CDATA[
<key name="rgba-order" type="s">
  <default>'rgb'</default> <!-- note quotes -->
</key>
]]>
        </programlisting>
      </para>
      <para>
        Another possible complication is that GConf specifies full paths
        for each key, while a GSettings schema has a 'path' attribute that
        contains the prefix for all the keys in the schema, and individual
        keys just have a simple name. So
        <programlisting>
<![CDATA[
<key>/schemas/desktop/gnome/font_rendering/antialiasing</key>
]]>
        </programlisting>
        becomes
        <programlisting>
<![CDATA[
<schema id="org.gnome.font" path="/desktop/gnome/font_rendering/">
  <key name="antialiasing" type="s">
]]>
        </programlisting>
      </para>
      <para>
        Default values can be localized in both GConf and GSettings schemas,
        but GSettings uses gettext for the localization. You can specify
        the gettext domain to use in the <tag class="attribute">gettext-domain</tag>
        attribute. Therefore, when converting localized defaults in GConf,
        <programlisting>
<![CDATA[
<key>/schemas/apps/my_app/font_size</key>
  <locale name="C">
    <default>18</default>
  </locale>
  <locale name="be">
    <default>24</default>
  </locale>
</key>
]]>
        </programlisting>
        becomes
        <programlisting>
<![CDATA[
<schema id="..." gettext-domain="your-domain">
 ...
<key name="font-size" type="i">
  <default l10n="messages" context="font_size">18</default>
</key>
]]>
        </programlisting>
      </para>
      <para>
        GSettings uses gettext for translation of default values.
        The string that is translated is exactly the string that appears
        inside of the <tag class='starttag'>default</tag> element.  This
        includes the quotation marks that appear around strings.
        Default values must be marked with the <varname>l10n</varname>
        attribute in the <tag class='starttag'>default</tag> tag, which
        should be set as equal to <literal>'messages'</literal> or
        <literal>'time'</literal> depending on the desired category.  An
        optional translation context can also be specified with the
        <varname>context</varname> attribute, as in the example.  This
        is usually recommended, since the string "<literal>18</literal>"
        is not particularly easy to translate without context.  The
        translated version of the default value should be stored in the
        specified <varname>gettext-domain</varname>.  Care must be taken
        during translation to ensure that all translated values remain
        syntactically valid; mistakes here will cause runtime errors.
      </para>
      <para>
        GSettings schemas have optional <tag class="starttag">summary</tag> and
        <tag class="starttag">description</tag> elements for each key which
        correspond to the <tag class="starttag">short</tag> and
        <tag class="starttag">long</tag> elements in the GConf schema and
        will be used in similar ways by a future gsettings-editor, so you
        should use the same conventions for them: The summary is just a short
        label with no punctuation, the description can be one or more complete
        sentences. If multiple paragraphs are desired for the description, the
        paragraphs should be separated by a completely empty line.
      </para>
      <para>
        Translations for these strings will also be handled
        via gettext, so you should arrange for these strings to be
        extracted into your gettext catalog. One way to do that is to use
        intltool. Since intltool 0.50.1, schema files are
        supported, so all you have to do is to add your .gschema.xml
        files to <filename>POTFILES.in</filename> with a line like
        <programlisting>
        [type: gettext/gsettings]data/org.foo.MyApp.gschema.xml
        </programlisting>
      </para>
      <para>
        GSettings is a bit more restrictive about key names than GConf. Key
        names in GSettings can be at most 32 characters long, and must only
        consist of lowercase characters, numbers and dashes, with no
        consecutive dashes. The first character must not be a number or dash,
        and the last character cannot be '-'.
      </para>
      <para>
        If you are using the GConf backend for GSettings during the
        transition, you may want to keep your key names the same they
        were in GConf, so that existing settings in the users GConf
        database are preserved. You can achieve this by using the
        <option>--allow-any-name</option> with the
        <link linkend="glib-compile-schemas">glib-compile-schemas</link> schema
        compiler. Note that this option is only meant
        to ease the process of porting your application, allowing parts
        of your application to continue to access GConf and parts to use
        GSettings. By the time you have finished porting your application
        you must ensure that all key names are valid.
      </para>
    </section>

    <section><title>Data conversion</title>
      <para>
        GConf comes with a GSettings backend that can be used to
        facility the transition to the GSettings API until you are
        ready to make the jump to a different backend (most likely
        dconf). To use it, you need to set the <envar>GSETTINGS_BACKEND</envar>
        to 'gconf', e.g. by using
<programlisting>
  g_setenv ("GSETTINGS_BACKEND", "gconf", TRUE);
</programlisting>
        early on in your program. Note that this backend is meant purely
        as a transition tool, and should not be used in production.
      </para>
      <para>
        GConf also comes with a utility called
        <command>gsettings-data-convert</command>, which is designed to help
        with the task of migrating user settings from GConf into another
        GSettings backend. It can be run manually, but it is designed to be
        executed automatically, every time a user logs in. It keeps track of
        the data migrations that it has already done, and it is harmless to
        run it more than once.
      </para>
      <para>
        To make use of this utility, you must install a keyfile in the
        directory <filename>/usr/share/GConf/gsettings</filename> which
        lists the GSettings keys and GConf paths to map to each other, for
        each schema that you want to migrate user data for.
      </para>
      <para>
        Here is an example:
        <programlisting>
<![CDATA[
[org.gnome.fonts]
antialiasing = /desktop/gnome/font_rendering/antialiasing
dpi = /desktop/gnome/font_rendering/dpi
hinting = /desktop/gnome/font_rendering/hinting
rgba-order = /desktop/gnome/font_rendering/rgba_order

[apps.myapp:/path/to/myapps/]
some-odd-key1 = /apps/myapp/some_ODD-key1
]]>
        </programlisting>
        The last key demonstrates that it may be necessary to modify the key
        name to comply with stricter GSettings key name rules. Of course,
        that means your application must use the new key names when looking
        up settings in GSettings.
      </para>
      <para>
        The last group in the example also shows how to handle the case
        of 'relocatable' schemas, which don't have a fixed path. You can
        specify the path to use in the group name, separated by a colon.
      </para>
      <para>
        There are some limitations: <command>gsettings-data-convert</command>
        does not do any transformation of the values. And it does not handle
        complex GConf types other than lists of strings or integers.
      </para>
      <para>
        Don't forget to require GConf 2.31.1 or newer in your configure
        script if you are making use of the GConf backend or the conversion
        utility.
      </para>

      <para>
        If, as an application developer, you are interested in manually
        ensuring that <command>gsettings-data-convert</command> has been
        invoked (for example, to deal with the case where the user is
        logged in during a distribution upgrade or for non-XDG desktop
        environments which do not run the command as an autostart) you
        may invoke it manually during your program initialisation.  This
        is not recommended for all application authors -- it is your
        choice if this use case concerns you enough.
      </para>
      <para>
        Internally, <command>gsettings-data-convert</command> uses a
        keyfile to track which settings have been migrated.  The
        following code fragment will check that keyfile to see if your
        data conversion script has been run yet and, if not, will
        attempt to invoke the tool to run it.  You should adapt it to
        your application as you see fit.
      </para>
      <para>
        <programlisting>
<![CDATA[
static void
ensure_migrated (const gchar *name)
{
  gboolean needed = TRUE;
  GKeyFile *kf;
  gchar **list;
  gsize i, n;

  kf = g_key_file_new ();

  g_key_file_load_from_data_dirs (kf, "gsettings-data-convert",
                                  NULL, G_KEY_FILE_NONE, NULL);
  list = g_key_file_get_string_list (kf, "State", "converted", &n, NULL);

  if (list)
    {
      for (i = 0; i < n; i++)
        if (strcmp (list[i], name) == 0)
          {
            needed = FALSE;
            break;
          }

      g_strfreev (list);
    }

  g_key_file_free (kf);

  if (needed)
    g_spawn_command_line_sync ("gsettings-data-convert",
                               NULL, NULL, NULL, NULL);
}

]]>
        </programlisting>
      </para>
      <para>
        Although there is the possibility that the
        <command>gsettings-data-convert</command> script will end up
        running multiple times concurrently with this approach, it is
        believed that this is safe.
      </para>
    </section>
  </chapter>
