| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |
| <html> | |
| <head> | |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
| <title>Schema conversion: GIO Reference Manual</title> | |
| <meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> | |
| <link rel="home" href="index.html" title="GIO Reference Manual"> | |
| <link rel="up" href="ch34.html" title="Migrating from GConf to GSettings"> | |
| <link rel="prev" href="ch34s05.html" title="Change sets"> | |
| <link rel="next" href="ch34s07.html" title="Data conversion"> | |
| <meta name="generator" content="GTK-Doc V1.25.1 (XML mode)"> | |
| <link rel="stylesheet" href="style.css" type="text/css"> | |
| </head> | |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | |
| <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle"> | |
| <td width="100%" align="left" class="shortcuts"></td> | |
| <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td> | |
| <td><a accesskey="u" href="ch34.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td> | |
| <td><a accesskey="p" href="ch34s05.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td> | |
| <td><a accesskey="n" href="ch34s07.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td> | |
| </tr></table> | |
| <div class="section"> | |
| <div class="titlepage"><div><div><h2 class="title" style="clear: both"> | |
| <a name="id-1.5.4.7"></a>Schema conversion</h2></div></div></div> | |
| <p> | |
| 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. | |
| </p> | |
| <div class="example"> | |
| <a name="id-1.5.4.7.3"></a><p class="title"><b>Example 1. An example for using gsettings-schema-convert</b></p> | |
| <div class="example-contents"> | |
| <p>Running <strong class="userinput"><code>gsettings-schema-convert --gconf --xml --schema-id "org.gnome.font-rendering" --output org.gnome.font-rendering.gschema.xml destop_gnome_font_rendering.schemas</code></strong> on the following <code class="filename">desktop_gnome_font_rendering.schemas</code> file: | |
| </p> | |
| <pre class="programlisting"> | |
| <?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> | |
| </pre> | |
| <p> | |
| produces a <code class="filename">org.gnome.font-rendering.gschema.xml</code> file with the following content: | |
| </p> | |
| <pre class="programlisting"> | |
| <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> | |
| </pre> | |
| <p> | |
| </p> | |
| </div> | |
| </div> | |
| <br class="example-break"><p> | |
| 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 | |
| <code class="filename">.gschema.xml</code>. It is recommended to simply | |
| use the schema id as the filename, followed by this extension, | |
| e.g. <code class="filename">org.gnome.SessionManager.gschema.xml</code>. | |
| </p> | |
| <p> | |
| The XML source file for your GSettings schema needs to get installed | |
| into <code class="filename">$datadir/glib-2.0/schemas</code>, and needs to be | |
| compiled into a binary form. At runtime, GSettings looks for compiled | |
| schemas in the <code class="filename">glib-2.0/schemas</code> subdirectories | |
| of all <code class="envar">XDG_DATA_DIRS</code> directories, so if you install | |
| your schema in a different location, you need to set the | |
| <code class="envar">XDG_DATA_DIRS</code> environment variable appropriately. | |
| </p> | |
| <p> | |
| Schemas are compiled into binary form by the | |
| glib-compile-schemas utility. | |
| GIO provides a <code class="literal">glib_compile_schemas</code> | |
| variable for the schema compiler. | |
| </p> | |
| <p> | |
| You can ignore all of this by using the provided m4 macros. To | |
| do this, add to your <code class="filename">configure.ac</code>: | |
| </p> | |
| <pre class="programlisting"> | |
| GLIB_GSETTINGS | |
| </pre> | |
| <p> | |
| The corresponding <code class="filename">Makefile.am</code> fragment looks like | |
| this: | |
| </p> | |
| <pre class="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@ | |
| </pre> | |
| <p> | |
| </p> | |
| <p> | |
| This is not sufficient on its own. You need to mention what the source | |
| of the <code class="filename">my.app.gschema.xml</code> file is. If the schema | |
| file is distributed directly with your project's tarball then a mention | |
| in <code class="varname">EXTRA_DIST</code> 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 <code class="varname">EXTRA_DIST</code> for the | |
| source files used by that rule. | |
| </p> | |
| <p> | |
| One possible pitfall in doing schema conversion is that the default | |
| values in GSettings schemas are parsed by the <a href="../glib-GVariant.html#GVariant"><span class="type">GVariant</span></a> parser. | |
| This means that strings need to include quotes in the XML. Also note | |
| that the types are now specified as <a href="../glib-GVariant.html#GVariant"><span class="type">GVariant</span></a> type strings. | |
| </p> | |
| <pre class="programlisting"> | |
| <type>string</type> | |
| <default>rgb</default> | |
| </pre> | |
| <p> | |
| becomes | |
| </p> | |
| <pre class="programlisting"> | |
| <key name="rgba-order" type="s"> | |
| <default>'rgb'</default> <!-- note quotes --> | |
| </key> | |
| </pre> | |
| <p> | |
| </p> | |
| <p> | |
| 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 | |
| </p> | |
| <pre class="programlisting"> | |
| <key>/schemas/desktop/gnome/font_rendering/antialiasing</key> | |
| </pre> | |
| <p> | |
| becomes | |
| </p> | |
| <pre class="programlisting"> | |
| <schema id="org.gnome.font" path="/desktop/gnome/font_rendering/"> | |
| <key name="antialiasing" type="s"> | |
| </pre> | |
| <p> | |
| </p> | |
| <p> | |
| 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 <code class="sgmltag-attribute">gettext-domain</code> | |
| attribute. Therefore, when converting localized defaults in GConf, | |
| </p> | |
| <pre class="programlisting"> | |
| <key>/schemas/apps/my_app/font_size</key> | |
| <locale name="C"> | |
| <default>18</default> | |
| </locale> | |
| <locale name="be"> | |
| <default>24</default> | |
| </locale> | |
| </key> | |
| </pre> | |
| <p> | |
| becomes | |
| </p> | |
| <pre class="programlisting"> | |
| <schema id="..." gettext-domain="your-domain"> | |
| ... | |
| <key name="font-size" type="i"> | |
| <default l10n="messages" context="font_size">18</default> | |
| </key> | |
| </pre> | |
| <p> | |
| </p> | |
| <p> | |
| GSettings uses gettext for translation of default values. | |
| The string that is translated is exactly the string that appears | |
| inside of the <code class="sgmltag-starttag"><default></code> element. This | |
| includes the quotation marks that appear around strings. | |
| Default values must be marked with the <code class="varname">l10n</code> | |
| attribute in the <code class="sgmltag-starttag"><default></code> tag, which | |
| should be set as equal to <code class="literal">'messages'</code> or | |
| <code class="literal">'time'</code> depending on the desired category. An | |
| optional translation context can also be specified with the | |
| <code class="varname">context</code> attribute, as in the example. This | |
| is usually recommended, since the string "<code class="literal">18</code>" | |
| is not particularly easy to translate without context. The | |
| translated version of the default value should be stored in the | |
| specified <code class="varname">gettext-domain</code>. Care must be taken | |
| during translation to ensure that all translated values remain | |
| syntactically valid; mistakes here will cause runtime errors. | |
| </p> | |
| <p> | |
| GSettings schemas have optional <code class="sgmltag-starttag"><summary></code> and | |
| <code class="sgmltag-starttag"><description></code> elements for each key which | |
| correspond to the <code class="sgmltag-starttag"><short></code> and | |
| <code class="sgmltag-starttag"><long></code> 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. | |
| </p> | |
| <p> | |
| 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 <code class="filename">POTFILES.in</code> with a line like | |
| </p> | |
| <pre class="programlisting"> | |
| [type: gettext/gsettings]data/org.foo.MyApp.gschema.xml | |
| </pre> | |
| <p> | |
| </p> | |
| <p> | |
| 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 '-'. | |
| </p> | |
| <p> | |
| 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 | |
| <code class="option">--allow-any-name</code> with the | |
| glib-compile-schemas 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. | |
| </p> | |
| </div> | |
| <div class="footer"> | |
| <hr>Generated by GTK-Doc V1.25.1</div> | |
| </body> | |
| </html> |