Schema

範例檔

產生 gschema.xml

執行下面指令,產生「org.example.app-schema.gschema.xml」

cat > org.example.app-schema.gschema.xml <<EOF
<schemalist>
    <schema id="org.example.app-schema" path="/org/example/app-schema/" gettext-domain="app-schema">

        <key name="greeting" type="s">
            <default l10n="messages">"Hello"</default>
            <summary>A greeting</summary>
            <description>
                Greeting!
            </description>
        </key>

        <key name="count" type="i">
            <default>99</default>
            <summary>counter</summary>
            <description>
                Counter
            </description>
        </key>

        <key name="allow" type="b">
            <default>false</default>
            <summary>Is allowed?</summary>
            <description>
                Allow?
            </description>
        </key>


    </schema>
</schemalist>

EOF

執行下面指令,觀看「org.example.app-schema.gschema.xml」的內容

$ cat org.example.app-schema.gschema.xml

可以看到「org.example.app-schema.gschema.xml」的內容如下

<schemalist>
        <schema id="org.example.app-schema" path="/org/example/app-schema/" gettext-domain="app-schema">

                <key name="greeting" type="s">
                        <default l10n="messages">"Hello"</default>
                        <summary>A greeting</summary>
                        <description>
                                Greeting!
                        </description>
                </key>

                <key name="count" type="i">
                        <default>99</default>
                        <summary>counter</summary>
                        <description>
                                Counter
                        </description>
                </key>

                <key name="allow" type="b">
                        <default>false</default>
                        <summary>Is allowed?</summary>
                        <description>
                                Allow?
                        </description>
                </key>


        </schema>
</schemalist>

放至「/usr/share/glib-2.0/schemas/」

執行下面指令,將「org.example.app-schema.gschema.xml」放到「/usr/share/glib-2.0/schemas/」

$ sudo cp org.example.app-schema.gschema.xml /usr/share/glib-2.0/schemas/

編譯 schemas

執行下面指令,將「/usr/share/glib-2.0/schemas/」裡面的「.gschema.xml」編譯成「/usr/share/glib-2.0/schemas/gschemas.compiled」

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

gsettings 使用範例

$ gsettings list-schemas | grep app-schema

顯示

org.example.app-schema

執行

$ gsettings list-recursively | grep app-schema

顯示

org.example.app-schema allow false
org.example.app-schema count 99
org.example.app-schema greeting 'Hello'

執行

$ gsettings list-keys org.example.app-schema

顯示

allow
count
greeting

執行

$ gsettings get org.example.app-schema greeting

顯示

'Hello'

執行

$ gsettings set org.example.app-schema greeting hi

然後再執行

$ gsettings get org.example.app-schema greeting

顯示

'hi'

執行

$ gsettings reset org.example.app-schema greeting

然後再執行

$ gsettings get org.example.app-schema greeting

顯示

'Hello'

dconf 使用範例

執行

$ gsettings set org.example.app-schema greeting hi

然後再執行

$ gsettings get org.example.app-schema greeting

顯示

'hi'

執行

$ dconf dump / | grep org/example/app-schema -A 2

顯示

[org/example/app-schema]
greeting='hi'

執行

$ dconf list /org/example/app-schema/

顯示

greeting

執行

$ dconf read /org/example/app-schema/greeting

顯示

'hi'

執行

$ dconf write /org/example/app-schema/count 88888

執行

$ dconf read /org/example/app-schema/count

顯示

88888

執行

$ gsettings get org.example.app-schema count

顯示

88888

關於 ~/.config/dconf/user

執行

$ strings ~/.config/dconf/user | grep count

顯示

count

執行

$ strings ~/.config/dconf/user | grep greeting

顯示

sgreeting
$ grep hi ~/.config/dconf/user

顯示

Binary file /home/sam/.config/dconf/user matches

執行

gsettings reset org.example.app-schema greeting
gsettings reset org.example.app-schema count

然後

$ dconf dump / | grep org/example/app-schema

沒有顯示任何結果,直接出現下一個提示字元。

$ strings /usr/share/glib-2.0/schemas/gschemas.compiled | grep greeting

顯示

greeting

解除 schema

執行

$ sudo rm /usr/share/glib-2.0/schemas/org.example.app-schema.gschema.xml

再執行

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

測試是否解除

$ gsettings get org.example.app-schema greeting

顯示

No such schema 'org.example.app-schema'

執行

$ gsettings list-schemas | grep org.example.app-schema

和執行

$ gsettings list-recursively | grep org.example.app-schema

都沒有顯示任何結果,直接出現下一個提示字元。

相關檔案

  • /usr/share/glib-2.0/schemas/org.example.app-schema.gschema.xml
  • /usr/share/glib-2.0/schemas/gschemas.compiled
  • ~/.config/dconf/user

小結

從以上的實驗,我個人推測,歸納以下規則

  • 執行「gsettings get」,會先從「~/.config/dconf/user」這裡找資料,
  • 若沒有找到,則「/usr/share/glib-2.0/schemas/gschemas.compiled」找。
  • 「/usr/share/glib-2.0/schemas/gschemas.compiled」紀錄的是預設值,
  • 若有透過「gsettings set」更改值,則會紀錄新到「~/.config/dconf/user」,
  • 若是「gsettings reset」,則會將「~/.config/dconf/user」的「該紀錄(key和value)」刪除。